C# 7.0 的新特性

  1. Out 变量
    old:
    int x, y; // 需要“预声明”
    p.GetCoordinates(out x, out y);
    new:
    p.GetCoordinates(out int x, out int y);
  2. 模式匹配 
    带模式的 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));
    }
  3. 元组 从一个方法返回多个值
    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"); 
    }
  4. Literal 改进 允许使用“_”作为数字分隔符在数字literals中
    var d = 123_456;
    var x = 0xAB_CD_EF;
  5. Ref 返回和本地
    int[] array = { 1, 5};
    ref int place = ref array[1];
    place = 9;
    Console.WriteLine(array[1]); //这里输出是9
  6. 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>,则可以轻松避免这种分配。(结构体传参是浅拷贝)
  7. 更多的表达式体成员 表达式体方法,属性等是 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 访问器
        }
    }
  8. 抛出表达式 在表达式中抛出异常非常简单:只要调用一个为你做这件事的方法!但是在 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();
    }

猜你喜欢

转载自blog.csdn.net/st75033562/article/details/130969815