语法糖的出现绝对是广大码农的福音,为什么叫语法糖?简而言之就是你之前需要写10行代码,现在一行代码就可以搞定并且效率还不下降,你说甜不甜,鸡腿香不香?语法糖能够增加程序的可读性,从而减少程序代码出错的机会。下面介绍一下C#新增或者常用的语法糖。
语法糖有点甜 - 图1

快速自动属性

自动属性
以前:手写私变量+公属性
现在:声明空属性,编译器自动生成对应私成员字段。写法:输入prop ,连续按两次tab键,自动生成属性。

NULL检查运算符(?.)

“?. ”运算符,可帮助编写更少的代码来处理 null 检查,如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL。这样可以避免很多程序的异常终止。

  1. string str1 = "abcd";
  2. string str2 = null;
  3. Console.WriteLine(str1?.Length);// 输出 4
  4. Console.WriteLine(str2?.Length);// 输出空

三目运算符和空接合运算符

  1. int a= 2;
  2. //如果 a大于等于0result等于1,否则result等于0.
  3. int result = a >= 0 ? 1 : 0;
  4. //空接合
  5. string sex = null;
  6. string s = sex ?? "未知";//左边的变量如果为null则值为右边的变量,否则就是左边的变量值

匿名类型(var)

var定义变量有以下四个特点:
1、必须在定义时初始化
2、一旦初始化完成,就不能再给变量赋与初始值不同类型的值了
3、var要求是局部变量
4、使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样
匿名类型的限制:
1、匿名类型不支持事件、自定义方法和自定义重写
2、匿名类型是隐式封闭的
3、匿名类型的实例创建只使用默认构造函数
4、匿名类型没提供可供控制的类名称(使用var定义的)

  1. var a = 1 ;
  2. a = "i liove u"//错误
  3. var p = new new {
  4. birthday="2019-11-08",
  5. name = "jack",
  6. aget=10
  7. };
  8. for

each与List迭代器

foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。

  1. //常规写法
  2. foreach (string itemin list)
  3. {
  4. Console.WriteLine(item);
  5. }
  6. //List迭代器
  7. list.ForEach(a
  8. => Console.WriteLine(a));

初始化List集合的值

  1. // 简化之前
  2. List listString = new List();
  3. listString.Add("小王");
  4. listString.Add("小贤");
  5. // 简化后
  6. List listString = new List() {

Dictionary初始化赋值的新语法

  1. Dictionary dic_student = new Dictionary()
  2. {
  3. {"xiaohua","男"},{"xiaohong","女"}
  4. };

对象初始化器

  1. //原始写法
  2. People xiaoming = new People();
  3. xiaoming.name = "xiaoming";
  4. xiaoming.age = 10 ;
  5. xiaoming.sex = "";
  6. //语法糖写法
  7. People xiaoming = new People(){name = "xiaoming",age = 10 ,sex = "男"};

using自动资源释放

为了节约资源,每次使用完毕后都要释放掉资源,其中可以使用Using和try finally来进行释放资源操作。需要注意的是使用Using释放资源的对象都必须继承IDisposable接口。

  1. // try finally 写法
  2. SqlConnection conn = null;
  3. try
  4. {
  5. conn = new SqlConnection("连接数据库");
  6. conn.Open();
  7. }
  8. finally
  9. {
  10. conn.Close();
  11. conn.Dispose();
  12. }
  13. // Using语法糖写法
  14. using (SqlConnection conn=new SqlConnection("连接数据库"))
  15. {
  16. conn.Open();
  17. }

字符串嵌入$

字符串构造我们一般用Format函数,但是现在加入了“$”更加简单方便

  1. // 之前
  2. var str=string.Format("时间:{0}", DateTime.Now);
  3. // 改进
  4. var str=$"时间:{DateTime.Now}";

元组

元组(Tuple)使方法 可以返回多个返回值 而不需要借助 out ref 关键字。

  1. public static Tuple ReturnOldTuple()
  2. int id = 6;
  3. string name = "王";
  4. int num = 50;
  5. //创建返回对象 Tuple
  6. return Tuple.Create(id, name, num);

局部函数

局部函数的主要功能与匿名方法非常相似:在某些情况下,创建一个命名函数在读者的认知负担方面代价太大。有时,函数本身就是另一个函数的部分逻辑,因此一个单独的命名实体来污染“外部”范围是毫无意义的。您可能认为此功能是多余的,因为匿名委托或Lambda表达式可以实现相同的行为。但事实并非如此,匿名函数有一定的限制,其特征可能不适合您的场景。

  1. static void Main(string[] args)
  2. {
  3. int Result = Add(5, 7) + subtract(6,2);
  4. Console.WriteLine("结果:"+Result);
  5. Console.ReadKey();
  6. //加
  7. int Add(int a,int b) {
  8. return a + b;
  9. }
  10. int x = 1;
  11. int y = -1 ;
  12. int result = Add(x,y);
  13. }

匿名委托与lambda

  1. //以前写法
  2. class TestClass
  3. {
  4. //定义委托
  5. public delegate void Delegate_Test(string str);
  6. //定义委托方法
  7. public void Method(string str)
  8. {
  9. Console.WriteLine(str);
  10. }
  11. public void Use(Delegate_Test d, string str)
  12. {
  13. d(str);
  14. }
  15. }
  16. TestClass test = new TestClass();
  17. test.UseDelegate(new TestClass.Delegate_Test(mc.Method), "Hello!");
  18. //新写法*********
  19. //不需要定义委托
  20. //使用匿名委托
  21. test.Use(delegate(string str)
  22. {
  23. Console.WriteLine(str);
  24. }, "Hello!");
  25. //使用Lambda表达式
  26. test.Use(s =>
  27. {
  28. Console.WriteLine(s);
  29. }, "Hello!");

Lambda表达式

lambda表达式这个应该很多人都知道,就是俗称的箭头函数;lambda在高级写法中是用的十分多的。
举一个最简单的例子,假设有一个List,里面存的是人员信息,现在我需要按人员年龄排序,用lambda就十分快捷;
List list = new List();
list.Sort((x, y) => { return x.age.CompareTo(y.age);});
Lambda最基本的语法:{参数列表}=>{方法体},但是lambda有很多变体,在不同的情况下可以省去不同的内容:
如果参数列表只包含一个推断类型参数时:
参数列表=>{方法体}
前提:x的数据类型可以根据上下文推断出来
x =>{returm x+1}
如果方法体只包含一条语句时:
{参数列表}=>表达式
{int x} => x+1;