目录
1.可空类型
1.值类型后面加? 表示可空类型,是一种特殊的值类型,可以赋值为null, int? nillabe = null;
2.引用类型后面不能加?因为本身就可以赋值为空
3.普通值类型 int a = null //报错!
if (b.HasValue)
{ Console.WriteLine (b.Value);} //通过HasValue属性判断是否有值
else
{ Console.WriteLine ("dd");} //通过value属性获取值
Console.WriteLine (c.GetValueOrDefault());//获取可空类型的值,无值则返回一个()中的默认值
Console.WriteLine (c.GetHashCode()); //获取可空类型的值,只能返回0,不能指定默认值
2.空合并操作符
1.如果 ?? 左边的数不为null,则返回左边的数,左边为空,则返回右边的数
2.??左边的值可以是可空类型和引用类型,不能是普通值类型
int? c = null;
int z = c ?? 100; // int a=9; int z = c ?? a;
Console.WriteLine (z); // c为空,返回右边的值100
3.匿名方法
1.没有名字的方法,没有名字只能在定义的时候进行调用,其它时候无法调用
2.和委托一起使用,将匿名方法赋值给委托变量,通过变量调用匿名方法
3.不能通过函数名调用,也可以不返回值,也可以添加委托链
public delegate int mydelega(int x,int y);
int main()
{mydelega de = delegate(int x, int y){return x + y;}; //注意赋值语句的分号;
de +=delegate(int x,int y){return x -y ;};//可以添加函数链
int c1 = de(2,4); Console.WriteLine (c1);
}
4.闭包:形成一个没有释放的函数。
1.形成过程:通过del 指向fun中的一个匿名方法,del在程序结束后才释放,del指向的匿名方法也会在程序结束后才释放。
匿名函数不释放,fun函数也不会释放
public delegate void mydelega();
public static mydelega del;
int main()
{
fun ();del ();del();
}
public static void fun()
{ int count = 0;del = delegate()
{Console.WriteLine (count++);};
}
2.通过闭包形成一个简单的封装,外界不能直接访问count,可以通过aset() aget()获取。
public delegate void sett(int t);
public delegate int gett();
public static sett aset;
public static gett aget;
public static void fun()
{ int count = 0;
aset = delegate(int t) {count = t;};
aget = delegate() {return count;};
}
int main()
{ fun ();
aset (100);
int a = aget ();
Console.WriteLine (a);
}
4.迭代器
foreach遍历数组中元素时会用到迭代器,它的接口 IEnumerable
public class Vector: IEnumerable //自己写的类,要想使用foreach,需要写接口中的迭代器方法
{ …
public IEnumerator GetEnumerator()
{ for(int i=0;i<size;i++)
{yield return array[i];}
} //注意方法名和返回值。循环调用GetEnumerator() 方法
}
5.属性字段小注
自动实现的属性,会自动生成两个字段(没名字)
private string name; //不用写了
public string Name{get; set;} public People(string name){ Name = name;}
在结构体中,使用自动实现的属性时候,必须显示的调用无参构造函数this(),否则出错
6.隐式类型
关键字var 来声明变量和数组,声明时不知道变量的类型,根据变量的值推断其类型。var v =4;
1.只能是局部变量。不能声明为字段(静态和实例都不可以) private var //报错
2.声明是必须初始化 var d = delegate{…} //报错
3.变量不能初始化为一个方法组(类似委托链),也不能为一个匿名函数 var d =fun //报错
4.变量不能初始化为null, var a =null //报错
5.不能使用var声明方法中的类型参数 fun(var c) //报错
优点:省去名字较长的声明
var t = new Dictionary<string ,int> ();
var b = new[]{1,2,3,4};
7.对象初始化器
对对象进行初始化
1.调用无参构造函数先对对象初始化,然后调用对象初始化器进行初始化
2.圆括号()可以不写
3.类中必须有一个无参构造函数
4.自定义的有参构造函数会覆盖默认的无参构造函数,需重新定义一个无参构造函数
student t = new student(){ Name = "dd", Age = 22, Id = 1001 };
8.集合初始化器
对集合中的元素初始化
1.系统自带的List容器可以 使用
List t = new List(){1,2,3,4,5};
2.初始化对象时,首先调用迭代器,然后通过Add方法向容器中添加元素
自定义的类需要添加Add()方法和迭代器
Vector t = new Vector (5){ 1,2,3,4,5 };