IFormattable• IFormatProviderを指定したい場合• (カルチャー指定などをしたい場合)•stringじゃなくてIFormattableで受ける• .NET 4.6/.NET Core 5を必要とする唯一の機能• FormattableStringは新しく追加された型• (他は、await除けば.NET 2.0で動く)IFormattable f = $"{x:c}, {x:n}";var s = f.ToString(null, new CultureInfo("en-us"));FormattableString型のインスタンスが作られるカルチャー指定して文字列化
39.
nameof式(nameof expression)• 識別子(変数名、メンバー名、クラス名…)を文字列リテラル化if(x < 0)throw new ArgumentException("x must be positive");if (x < 0)throw new ArgumentException(nameof(x) + " must be positive");リファクタリングの対象にならないリファクタリングの対象になる• 「リネーム」できる• 「定義に移動」できる• 「参照の検索」できる
light weight dynamic•プロパティ アクセスと辞書アクセスを近づける発想var p = new Point();p.X = 1;p.Y = 2;var d = new Dictionary();d["X"] = 1;d["Y"] = 2;var p = new Point{X = 1,Y = 2,};var d = new Dictionary{["X"] = 1,["Y"] = 2,};var d = new Dictionary();d.$X = 1;d.$Y = 2;var d = new Dictionary{$X = 1,$Y = 2,};没没一瞬、こういう文法が提案されてた(キモいって言うやつ多すぎるからやめた)
47.
Working with data•C# 7.0の大きなテーマの1つ• light weight dynamicはそのはしり• 7.0にご期待ください• レコード型、タプル型「データ」が主役var d = new Dictionary{["X"] = 1,["Y"] = 2,};低コスト、低リスクなこいつだけが6.0に残った
48.
例外フィルター• 例外 catchに条件を付けれるように• ちなみに• C#的には新機能だけど、.NET的には1.0のころから持ってる機能• C#がそれに対応しただけtry{…}catch (Exception ex) when (ex.InnerException is IOException){…}
追悼: 構造体の引数なしコンストラクター• 構造体にも引数なしのコンストラクターを定義できるようにするはずだった•.NETのランタイム レベルでバグがあることが発覚して断念• Activator.CreateInstance<T>() が new T() をnullに置き換えるstruct MyInt{public readonly int Value;public MyInt() { Value = -1; }public MyInt(int value) { Value = value; }}没
68.
追悼: プライマリ コンストラクター•型定義の型名の直後にコンストラクターを1個書けた• 7.0でレコード型に吸収予定class Immutable(int x){public int X { get; } = x;}class Immutable(int x) { } 未未
69.
追悼: 変数宣言式(declaration expressions)•式の途中で変数宣言できた• 7.0でパターン マッチングと合わせて作り直す予定while ((var line = Console.ReadLine()) != null)if (int.TryParse(line, out var x))(var y = Math.Sin(x)) * y;if (x is string s) { … }else if (x is int n) { … }未未