一、ref&out
共同点:两者都是对基本类型(int、bool、float、double···等)以及string的值进行修改。
不同点:ref是对有值参数(有初始化的参数)经行修改,out是对无值参数(没有经行初始化的参数)修改。
二、可变参数params
static int Sum(int nul,params int[] nums)
{
return nums.Sum();
}
static void Main(string[] args)
{
Console.WriteLine(Sum(1, 2, 3, 4));
}
必须为参数最后一位
三、递归&抛出异常
static void Main(string[] args)
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(Fib(i));
}
Console.WriteLine(FileOrDirCount("D:/"));
}
//斐波那契额数列 递归演示
static long Fib(long n)
{
if (n == 1 || n == 2) return 1;
return Fib(n - 1) + Fib(n - 2);
}
//用递归查询文件数量
static long FileOrDirCount(string path)
{
long count = 0;
//处理异常 可能会遇到无法访问的文件夹
try
{
//统计file的个数
var files = Directory.GetFiles(path);
count += files.Length;
//统计directory的个数
var dirs = Directory.GetDirectories(path);
foreach (var item in dirs)
{
count += FileOrDirCount(item);
}
}
catch (Exception)
{
//throw;//交给外部方法处理
}
return count;
}
四、get&set
//两种方式
//1
public string Name { get; set; }
//2
private string _name ;
public string Name
{
get { return _name; }
set { _name = value; }
}
//有两个类person:
public class person
{
public string name;
}
public class person
{
public string Name{set;get;}
}
简单说下区别吧:当实例化第一个“person”这个类时,系统在分配内存空间时对name属性直接分配内存,之后对name属性的操作也是直接操作内存中name属性所在的这个块;而当实例化第二个“人”类型时,系统会先分配一个叫name的private私有的内存空间(此处的name对于类的内部使用,Name对于外部操作使用,要有所区分),之后的读与写的操作都是通过Name这个public的类似于指针的东西来关联name进行,以此达到封装的目的,并且通过get和set关键字也可以控制可读还是可写。建议用后者
https://www.cnblogs.com/liuyaozhi/p/4920275.html
五、初始化&匿名函数
//类初始化 构造函数
class Test {
public Test()//普通构造
{
Name = "AK";
}
public Test(string _name) : this()//继承其他构造的构造函数
{
Name += _name;
}
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Test t = new Test("47");//类在实例化的时候进行对类的初始化
Test test1 = new Test() { Name = "xx" };//对象初始化
var man = new { Name = "xx", Age = 20 };//匿名函数 适用短期使用的类型
}
}