1 var list = new List<int>(); n = ref list.Count; // error: 属性或索引器不能作为 out 或 ref 参数传递
原理解析:非常简单就是指针传递,并且个人觉得此语法的使用场景非常有限,都是用来处理大对象的,目的是减少GC提高性能。
5. 局部函数(Local functions)C# 7 中的一个功能“局部函数”,如下所示:
1 static IEnumerable<char> GetCharList(string str) 2 { 3 if (IsNullOrWhiteSpace(str)) ArgumentNullException(nameof(str)); GetList(); 7 8 IEnumerable<char> GetList() 9 { 10 for (int i = 0; i < str.Length; i++) 11 { str[i]; 13 } 14 } 15 }
使用方法:
1 [数据类型,void] 方法名([参数]) 2 { }
原理解析:局部函数虽然是在其他函数内部声明,但它编译后就是一个被 internal 修饰的静态函数,它是属于类,至于它为什么能够使用上级函
明跟位置无关,并可无限嵌套。
总结:个人觉得局部函数是对 C# 异常机制在语义上的一次补充(如上例),以及为代码提供清晰的结构而设置的语法。但局部函数也有其缺点,
就是局部函数中的代码无法复用(反射除外)。
6. 更多的表达式体成员(More expression-bodied members)C# 6 的时候就支持表达式体成员,但当时只支持“函数成员”和“只读属性”,这一特性在C# 7中得到了扩展,它能支持更多的成员:构造函数
set 访问器的属性、以及索引器。如下所示:
Student 2 { _name; Student(string name) => _name = name; ~Student() => Console.WriteLine(); Name 13 { 14 get => _name; ; 16 } [string name] => Convert.ToBase64String(Encoding.UTF8.GetBytes(name)); 20 }
备注:索引器其实在C# 6中就得到了支持,但其它三种在C# 6中未得到支持。
7. Throw 表达式(Throw expressions)异常机制是C#的重要组成部分,但在以前并不是所有语句都可以抛出异常的,如:条件表达式(? :)、null合并运算符(??)、一些Lambda
Student 2 { _name = GetName() ?? throw new ArgumentNullException(nameof(GetName)); _age; Age 8 { 9 get => _age; ArgumentException() : value; 11 } GetName() => null; 14 }
8. 扩展异步返回类型(Generalized async return types)以前异步的返回类型必须是:Task、Task<T>、void,现在 C# 7 中新增了一种类型:ValueTask<T>,如下所示:
ValueTask<int> Func() 2 { 3 await Task.Delay(3000); ; 5 }
总结:ValueTask<T> 与 ValueTuple 非常相似,所以就不列举: ValueTask<T> 与 Task 之间的异同了,但它们都是为了优化特定场景性能而
新增的类型。
使用 ValueTask<T> 则需要导入: Install - Package System.Threading.Tasks.Extensions
9. 数字文本语法的改进(Numeric literal syntax improvements)C# 7 还包含两个新特性:二进制文字、数字分隔符,如下所示: