c#6.0
一、自动属性初始化,属性可以自动赋初始值,例如:
public string Name { get; set; } = "summit";
public int Age { get; set; } = 22;
public DateTime BirthDay { get; set; } = DateTime.Now.AddYears(-20);
public IList
二、导入静态类
using static System.Math;//静态导入static类
导入静态类以后可以省略类名调用内部成员
三、字符串格式化,可以直接使用$进行字符串的嵌入了,例如:
2 Console.WriteLine($"年龄:{this.Age} 生日:{this.BirthDay.ToString("yyyy-MM-dd")}");
4 Console.WriteLine($"{(this.Age <= 22 ? "小鲜肉" : "老鲜肉")}");
四、空值运算符,如果是null值也可以调用方法了,这时程序什么都不会输出,例如:
1 int? iValue = 10;
2 Console.WriteLine(iValue?.ToString());//不需要判断是否为空
3 string name = null;
4 Console.WriteLine(name?.ToString()); // 程序不会报错,也不会输出任何值
5 Console.WriteLine("空值运算符");
结果:
这样就不需要像以前一样先判断一下变量是不是null值了。
五、对象初始化器
在前面一篇文章中讲过一次C#语法糖,在那里讲过对象初始化器和集合初始化器,以前初始化字典集合要像下面的方式:
1 IDictionary
2 {
3 { 1,"first"},
4 { 2,"second"}
5 };
c#6.0新增
1 IDictionary
2 {
3 [4] = "first",
4 [5] = "second"
5 };
六、异常过滤器,可以设置在满足某种条件的情况下,才能进入异常捕获,例如:
1 int exceptionValue = 10;
2 try
3 {
4 Int32.Parse("s");
5 }
6 catch (Exception e) when (exceptionValue > 1)//满足条件才进入catch
7 {
8 Console.WriteLine("catch");
9 }
七、nameof表达式
我们以前使用过typeof,typeof()可以获取类型,nameof表达式和typeof一样的,例如:
Console.WriteLine(nameof(peopleTest)); //peopleTest
Console.WriteLine(nameof(people.Name));//Name
八、在属性/方法里面使用Lambda表达式
public string NameFormat => “zhangsan”;//只读属性
public void Print() => Console.WriteLine(Name);
c#7.0
一、out输出参数
在以前使用out输出参数的时候,必须先定义变量,然后才能使用, 在C#7.0中,可以不用先定义,就能够直接使用了:
this.DoNoting(out int x, out int y);
this.DoNoting(out var l, out var m);
二、模式
public void PrintStars(object o)
{
if (o is null) return; // 常量模式 "null"
if (!(o is int i)) return; // 类型模式 定义了一个变量 "int i" i的值就是o的值 相当于is类型判断
Console.WriteLine($"i={i}");
}
除了可以像上面那样使用外,还可以使用下面的方式:
1 private void Switch(string text)
2 {
3 int k = 100;
4 switch (text)
5 {
6 case "Tom" when k > 10: // text="Tom"且k<10才会输出Tom
7 Console.WriteLine("Tom");
8 break;
9 case "Joe" when text.Length < 10: //text="Joe"且text的长度<10才会输出Joe
10 Console.WriteLine("Joe");
11 break;
12 case string s when s.Length > 7://模式 定义变量s,s就是text的值
13 Console.WriteLine(s);
14 break;
15 default:
16 Console.WriteLine("default");
17 break;
18 case null:
19 Console.WriteLine("null");
20 break;
21 }
22 }
三、元组
先来看下面的两个方法:
1 ///
2 /// 使用默认参数名称
3 ///
4 ///
5 ///
6 private (string, string, string) LookupName(long id) // tuple return type
7 {
8 return ("first", "middle", "last");
9 }
10
11 ///
12 /// 不使用默认参数名称
13 ///
14 ///
15 ///
16 private (string first, string middle, string last) LookupNameByName(long id) // tuple return type
17 {
18 return ("first", "middle", "last");
19 //return (first: "first", middle: "middle", last: "last");
20 }
调用:
1 // 使用默认参数名称:Item1、Item2、Item3
2 Console.WriteLine($"使用默认参数名称");
3 var result = this.LookupName(1);
4 Console.WriteLine(result.Item1+result.Item2+result.Item3);
7 // 不使用默认参数名称
8 Console.WriteLine($"不使用默认参数名称");
9 var result2 = this.LookupNameByName(1);
10 Console.WriteLine(result2.first+result2.middle+result2.last);
13 // 也可以使用默认参数名称
14 Console.WriteLine($"也可以使用默认参数名称");
15 Console.WriteLine(result2.Item1+result2.Item2+result2.Item3);
16 Console.WriteLine();
17 Console.WriteLine();
四、数字分割
如果数字太长,可以按照一定的位数用“_”进行分割,例如:
1 long big = 100_000_0000;
2 Console.WriteLine($"big={big}");