More Related Content Similar to .NET Core 3.0 で使える C# 8
Similar to .NET Core 3.0 で使える C# 8 (20) More from m ishizaki (20) .NET Core 3.0 で使える C# 82. / 34
自己紹介
石崎 充良 ( @mishi_cs )
Microsoft MVP for Developer Technologies
言語: C# XAML
活動:
・C# もくもく会 (connpass)
・C# Tokyo (connpass)
2
5. / 34
機能名一覧
1. 読み取り専用メンバー
2. 既定のインターフェイス メンバー
3. パターン マッチングの拡張機能:
1. switch 式
2. プロパティのパターン
3. タプル パターン
4. 位置指定パターン
4. using 宣言
5. 静的ローカル関数
6. 破棄可能な ref 構造体
7. null 許容参照型
8. 非同期ストリーム
9. インデックスと範囲
10. null 合体割り当て
11. 構築されたアンマネージド型
12. 入れ子になった式の stackalloc
13. verbatim 補間文字列の拡張
5https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8
6. / 34
• 構造体のメソッドに readonly キーワードを付けられる
• class で使おうとするとエラー
• メソッドの中で値を変更するコードはエラー
1. 読み取り専用メンバー
6
8. / 34
• 警告の内容
• こんな場合に警告の出ているメソッド (例では .ToString() メソッド) を使ったタイミン
グで point のコピーが作られる (インスタンスが一つ生まれる)
1. 読み取り専用メンバー
8
'readonly' メンバーから readonly 以外のメンバー 'Point.X.get' を呼び出すと、
'this' の暗黙のコピーが生成されます
11. / 34
2. 既定のインターフェイス メンバー
• クラスで実装するとインターフェイス型でも実装クラスの実装が呼ばれる
11
Method2 の結果は全て 1
実装クラスでは 1 を返す
12. / 34
3.1. switch 式
• パターンマッチングの switch が式なので結果が返る
12
switch の結果を
変数 val に入れられる
19. / 34
4. using 宣言
• using をブロックにしなくて良くなった。スコープを抜けると Dispose
19
1
Dispose
2
これからこれまで
出力はどちらも
20. / 34
5. 静的ローカル関数
• 外部の変数をキャプチャできないローカル関数
20
外側の変数を
キャプチャできる
キャプチャできない
引数だけ
静的ローカル関数非静的ローカル関数
21. / 34
6. 破棄可能な ref 構造体
• Dispose メソッドを実装すると呼ばれる (ref でない場合は要 IDisposable )
21
ref 構造体ではエラー
> B.Dispose
Dispose メソッド
22. / 34
7. null 許容参照型
• 設定すると参照型も基本 null 非許容の扱いになる
• null を許容したい変数は ? を型の後ろに付けて宣言する
22
1: Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
2: null 参照の可能性があるものの逆参照です。 (※ null である可能性があります)
1
2
2
23. / 34
7. null 許容参照型
• かしこいので if や代入をみてくれている
23
1: Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
2: null 参照の可能性があるものの逆参照です。 (※ null である可能性があります)
1
2
2
if で非 null チェック後
は警告がでていない
非 null 値のが移入後は
は警告がでていない
24. / 34
7. null 許容参照型
• 使うには設定が必要 (変えると既存のコードが警告だらけに)
24
プロジェクト全体に
有効
付けたところだけ
有効
25. / 34
8. 非同期ストリーム
• foreach に await がつけられる
25https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#asynchronous-streams
IAsyncEnumerable<T>
ループ内に await
使う側の foreach で await
27. / 34
9. インデックスと範囲
• インデックスを扱う型と演算子を追加
• System.Index 型
• index from end 演算子の ^
27
演算子も Index 型
になる
30. / 34
11. 構築されたアンマネージド型
• アンマネージド型フィールドのみの場合、ジェネリック値型はアンマネージドになる
30
Error : マネージ型 ('Program.MyType<Program>') のアドレスの取得、
サイズの取得、またはそのマネージ型へのポインターの宣言が実行できません
int は OK
31. / 34
12. 入れ子になった式の stackalloc
• stackalloc[]{ } を foreach 等に直接書くと Span<T> になる
31
Error : 型 'int*' を 'System.Span<int>' に暗黙的に変換できません
Span<T> なら OK なところでは Span<T> になる
34. / 34
まとめ
• 時代は C# 8
• C# 8 は .NET Core 3.0
• .NET Core 3.0 今すぐダウンロード ( https://dotnet.microsoft.com/download )
34