C#进阶学习第十二天

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 };

猜你喜欢

转载自blog.csdn.net/JingDuiTell/article/details/88785410