- Out 变量
old: int x, y; // 需要“预声明” p.GetCoordinates(out x, out y); new: p.GetCoordinates(out int x, out int y);
- 模式匹配
带模式的 Is 表达式 if (o is null) return; //常量模式 if (o is int i) return; //类型模式 带模式的 Switch 语句shape是Circle、Rectangle的基类 switch(shape) { case Circle c: WriteLine($"circle with radius {c.Radius}"); break; case Rectangle s when (s.Length == s.Height): WriteLine($"{s.Length} x {s.Height} square"); break; case Rectangle r: WriteLine($"{r.Length} x {r.Height} rectangle"); break; default: WriteLine("<unknown shape>"); break; case null: throw new ArgumentNullException(nameof(shape)); }
- 元组 从一个方法返回多个值
public Test() { var name = FullName(); Console.WriteLine(name.Item1 + name.Item2 + name.Item3); //输出元组值 //可以用重命名的方式接受参数 //(var frist, var middle, var last) = FullName(); //var (frist_1, middle_1, last_1) = FullName(); } (string, string, string) FullName() //返回多个值(元组) { return ("1", "2", "3"); }
- Literal 改进 允许使用“_”作为数字分隔符在数字literals中
var d = 123_456; var x = 0xAB_CD_EF;
- Ref 返回和本地
int[] array = { 1, 5}; ref int place = ref array[1]; place = 9; Console.WriteLine(array[1]); //这里输出是9
- Async 返回类型增加 在C#调用异步方法必须要返回void,Task或Task<T> c# 7.0 增加ValueTask<T> Task 和 Task<TResult> 是引用类型,因此会产生内存分配会对性能产生负面影响,ValueTask 是一个结构。这具有性能优势,因为 ValueTask 在堆上没有对象。如果异步方法的使用者使用 Task.WhenAll 或 Task.WhenAny,则在异步方法中使用 ValueTask<T> 作为返回类型可能会产生高昂的成本。这是因为您需要使用 AsTask 方法将 ValueTask<T> 转换为 Task<T>这将产生一个分配,如果首先使用了缓存的 Task<T>,则可以轻松避免这种分配。(结构体传参是浅拷贝)
- 更多的表达式体成员 表达式体方法,属性等是 C# 6.0 中的一大亮点,但我们并未所有成员上启用它。C# 7.0 在可以拥有表达式体的列表中添加了访问器、构造器和析构器
class Person { private static ConcurrentDictionary<int, string> names = new ConcurrentDictionary<int, string>(); private int id = GetId(); public Person(string name) => names.TryAdd(id, name); // 构造器 ~Person() => names.TryRemove(id, out *); // 析构器 public string Name { get => names[id]; // get 访问器 set => names[id] = value; // set 访问器 } }
- 抛出表达式 在表达式中抛出异常非常简单:只要调用一个为你做这件事的方法!但是在 C# 7.0 中我们直接允许将 throw 在特定位置作为一个表达式
class Person { public string Name { get; } public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name)); public string GetFirstName() { var parts = Name.Split(" "); return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("No name!"); } public string GetLastName() => throw new NotImplementedException(); }
C# 7.0 的新特性
于 2023-06-01 14:15:35 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)