static void Main(){vara = 1;ref var d = ref PassThrough(ref a);d = 2;// (a, d) = (2, 2)}static ref int PassThrough(ref int b){ref var c = ref b;return ref c;}Ref Locals / Ref Returnsメモリ効率向上参照受け参照返し
19.
(int sum, intcount) Tally(IEnumerable<int> list){var s = 0; var c = 0;foreach (var x in list){s += x;c++;}return (s, c);}(int a, int b) t = Tally(new []{ 1, 2, 3 });TuplesValueTupleの糖衣構文多値戻り値サポート
より狭いスコープ//--- 定数マッチングvar v= x is 123;//--- 型マッチングobject x = "abc";if (x is string v){//--- 何か v を用いた処理}Type Switch - is -より簡易で厳密な判定
22.
object x =123;switch (x){case "abc":break;case int v when 100 < v: //--- v が 100 より大きいときbreak;case int v: //--- v が 100 以下のときbreak;}Type Switch - switch -より強力な条件分岐when 句での条件設定(case guard)
23.
class Program{//--- ラムダ形式メンバーにpublicstring Name => throw new NotImplementedException();public string SayHello() => throw new NotImplementedException();//--- 条件演算子 / null 結合演算子にpublic int ParseAsInt(string value)=> int.TryParse(value, out var x)? x: throw new ArgumentException(nameof(value));}Throw Expressionsコンパクトに書ける
Pattern Matching型や値の条件分岐をよりスッキリ書けるようにType Switchと呼ばれる is / switch 拡張だけ先行搭載される見込みAsync Streams非同期コレクション (= IAsyncEnumerable) の列挙をより簡単にforeach (await var x in asyncStreams) みたいに書けないか議論されていた未搭載機能 #3