C# 7.0 の新機能

  1. 出力変数
    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. リテラルの改善により、 数値リテラルの数値区切り文字として「_」を使用できるようになりました。
    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