SlideShare a Scribd company logo
/ 34
.NET Core 3.0 で使える C# 8
1
城東.NET #37
2019年10月16日
石崎 充良
/ 34
自己紹介
石崎 充良 ( @mishi_cs )
Microsoft MVP for Developer Technologies
言語: C# XAML
活動:
・C# もくもく会 (connpass)
・C# Tokyo (connpass)
2
/ 34
名言
良いアウトプットは
良い定時退社から生まれる
3
/ 34
C# 8 の新機能名
4
/ 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
/ 34
• 構造体のメソッドに readonly キーワードを付けられる
• class で使おうとするとエラー
• メソッドの中で値を変更するコードはエラー
1. 読み取り専用メンバー
6
/ 34
• 自動実装プロパティでないゲッターを呼ぶと警告(ゲッターが値を変更しないと限ら
ないため)
• ゲッターに readonly キーワードを付ければ OK
1. 読み取り専用メンバー
7
/ 34
• 警告の内容
• こんな場合に警告の出ているメソッド (例では .ToString() メソッド) を使ったタイミン
グで point のコピーが作られる (インスタンスが一つ生まれる)
1. 読み取り専用メンバー
8
'readonly' メンバーから readonly 以外のメンバー 'Point.X.get' を呼び出すと、
'this' の暗黙のコピーが生成されます
/ 34
2. 既定のインターフェイス メンバー
• インタフェースに実装ができる (ここでは Method2())
9
実装クラス型の変数ではエラー
インタフェース型変数は OK
/ 34
2. 既定のインターフェイス メンバー
• 同名メソッドを持つ複数のインターフェイスを実装する場合
10
変数の型で決まる
インターフェイス IB の 場合は
3 を返す
/ 34
2. 既定のインターフェイス メンバー
• クラスで実装するとインターフェイス型でも実装クラスの実装が呼ばれる
11
Method2 の結果は全て 1
実装クラスでは 1 を返す
/ 34
3.1. switch 式
• パターンマッチングの switch が式なので結果が返る
12
switch の結果を
変数 val に入れられる
/ 34
3.2. プロパティのパターン
• プロパティ値でマッチングできる
13
ワイルドカードは _
ここがマッチする
/ 34
3.2. プロパティのパターン
• インスタンスやプロパティへのアクセスは最小限
14
何をしてもログを出すように
一回しか実行されていない
/ 34
• タプルの各値でマッチング
3.3. タプル パターン
15
ここにマッチする
/ 34
• タプルを評価しても大丈夫
3.3. タプル パターン
16
/ 34
3.4. 位置指定パターン
• 分解結果でマッチング
分解とは?
17
こんな Deconstruct メソッド (名前は固定)
を作っておくと
代入でタプルにできる
/ 34
3.4. 位置指定パターン
• 分解結果をタプルでマッチング
18
x や y が where やマッチした時の式で使える
こんな風にも書けたが厳しい
/ 34
4. using 宣言
• using をブロックにしなくて良くなった。スコープを抜けると Dispose
19
1
Dispose
2
これからこれまで
出力はどちらも
/ 34
5. 静的ローカル関数
• 外部の変数をキャプチャできないローカル関数
20
外側の変数を
キャプチャできる
キャプチャできない
引数だけ
静的ローカル関数非静的ローカル関数
/ 34
6. 破棄可能な ref 構造体
• Dispose メソッドを実装すると呼ばれる (ref でない場合は要 IDisposable )
21
ref 構造体ではエラー
> B.Dispose
Dispose メソッド
/ 34
7. null 許容参照型
• 設定すると参照型も基本 null 非許容の扱いになる
• null を許容したい変数は ? を型の後ろに付けて宣言する
22
1: Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
2: null 参照の可能性があるものの逆参照です。 (※ null である可能性があります)
1
2
2
/ 34
7. null 許容参照型
• かしこいので if や代入をみてくれている
23
1: Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
2: null 参照の可能性があるものの逆参照です。 (※ null である可能性があります)
1
2
2
if で非 null チェック後
は警告がでていない
非 null 値のが移入後は
は警告がでていない
/ 34
7. null 許容参照型
• 使うには設定が必要 (変えると既存のコードが警告だらけに)
24
プロジェクト全体に
有効
付けたところだけ
有効
/ 34
8. 非同期ストリーム
• foreach に await がつけられる
25https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#asynchronous-streams
IAsyncEnumerable<T>
ループ内に await
使う側の foreach で await
/ 34
9. インデックスと範囲
• インデックスを扱う型と演算子を追加
• 範囲を扱う型と演算子を追加
26
こんな書き方ができる
[1..^0]
/ 34
9. インデックスと範囲
• インデックスを扱う型と演算子を追加
• System.Index 型
• index from end 演算子の ^
27
演算子も Index 型
になる
/ 34
9. インデックスと範囲
• 範囲を扱う型と演算子を追加
• System.Range 型
• 範囲演算子の ..
28
演算子も Range 型
になる
/ 34
10. null 合体割り当て
• ??= と書ける。+= と合わせて考えるとわかりやすい
29
+= と同じ
/ 34
11. 構築されたアンマネージド型
• アンマネージド型フィールドのみの場合、ジェネリック値型はアンマネージドになる
30
Error : マネージ型 ('Program.MyType<Program>') のアドレスの取得、
サイズの取得、またはそのマネージ型へのポインターの宣言が実行できません
int は OK
/ 34
12. 入れ子になった式の stackalloc
• stackalloc[]{ } を foreach 等に直接書くと Span<T> になる
31
Error : 型 'int*' を 'System.Span<int>' に暗黙的に変換できません
Span<T> なら OK なところでは Span<T> になる
/ 34
13. verbatim 補間文字列の拡張
• @$”” とも書ける。(これまでは $@”” だけ)
32
/ 34
まとめ
33
/ 34
まとめ
• 時代は C# 8
• C# 8 は .NET Core 3.0
• .NET Core 3.0 今すぐダウンロード ( https://dotnet.microsoft.com/download )
34
/ 34
ありがとうございました。
35

More Related Content

What's hot

Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造
Taku Miyakawa
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
道化師 堂華
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
道化師 堂華
 
C++ tips1 #include編
C++ tips1 #include編C++ tips1 #include編
C++ tips1 #include編
道化師 堂華
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
koturn 0;
 
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返るHiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
tsudaa
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
道化師 堂華
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
koturn 0;
 
C++入門?
C++入門?C++入門?
C++入門?
tsudaa
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
道化師 堂華
 
getstartedc#_1
getstartedc#_1getstartedc#_1
getstartedc#_1
Ryuichi ITO
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語
gypsygypsy
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
bleis tift
 
Chapter5.3
Chapter5.3Chapter5.3
Chapter5.3
Kenji Doi
 

What's hot (20)

Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
C++ tips1 #include編
C++ tips1 #include編C++ tips1 #include編
C++ tips1 #include編
 
PerlMotion
PerlMotionPerlMotion
PerlMotion
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返るHiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
C++入門?
C++入門?C++入門?
C++入門?
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
Ilerpg Study 003
Ilerpg Study 003Ilerpg Study 003
Ilerpg Study 003
 
getstartedc#_1
getstartedc#_1getstartedc#_1
getstartedc#_1
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
Chapter5.3
Chapter5.3Chapter5.3
Chapter5.3
 

Similar to .NET Core 3.0 で使える C# 8

C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
信之 岩永
 
Rで学ぶ離散選択モデル
Rで学ぶ離散選択モデルRで学ぶ離散選択モデル
Rで学ぶ離散選択モデル
宏喜 佐野
 
C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
Fujio Kojima
 
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング
keki3
 
2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...n-yuki
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会Kiyoshi Ogawa
 
2011 icse-reverse engineering feature models
2011 icse-reverse engineering feature models2011 icse-reverse engineering feature models
2011 icse-reverse engineering feature modelsn-yuki
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
nothingcosmos
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
信之 岩永
 
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0
Goichi Hirakawa
 
mruby を C# に 組み込んでみる
mruby を C# に 組み込んでみるmruby を C# に 組み込んでみる
mruby を C# に 組み込んでみる
Ryosuke Akiyama
 
【社内輪読会】Effective Java 8章
【社内輪読会】Effective Java 8章【社内輪読会】Effective Java 8章
【社内輪読会】Effective Java 8章
Akira Torii
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
信之 岩永
 
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行monglee
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
信之 岩永
 

Similar to .NET Core 3.0 で使える C# 8 (20)

Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
Rで学ぶ離散選択モデル
Rで学ぶ離散選択モデルRで学ぶ離散選択モデル
Rで学ぶ離散選択モデル
 
C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
 
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング
 
2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
 
2011 icse-reverse engineering feature models
2011 icse-reverse engineering feature models2011 icse-reverse engineering feature models
2011 icse-reverse engineering feature models
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0
 
mruby を C# に 組み込んでみる
mruby を C# に 組み込んでみるmruby を C# に 組み込んでみる
mruby を C# に 組み込んでみる
 
【社内輪読会】Effective Java 8章
【社内輪読会】Effective Java 8章【社内輪読会】Effective Java 8章
【社内輪読会】Effective Java 8章
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
Perl motion
Perl motionPerl motion
Perl motion
 

More from m ishizaki

継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#
m ishizaki
 
継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#
m ishizaki
 
Visual Studio を使わず .NET する
Visual Studio を使わず .NET するVisual Studio を使わず .NET する
Visual Studio を使わず .NET する
m ishizaki
 
Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話
m ishizaki
 
「スタバ」する話
「スタバ」する話「スタバ」する話
「スタバ」する話
m ishizaki
 
エンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについてエンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについて
m ishizaki
 
Build 2022 / Uno Platform
Build 2022 / Uno PlatformBuild 2022 / Uno Platform
Build 2022 / Uno Platform
m ishizaki
 
7 つの Blazor
7 つの Blazor7 つの Blazor
7 つの Blazor
m ishizaki
 
C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版
m ishizaki
 
仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話
m ishizaki
 
2022 抱負
2022 抱負2022 抱負
2022 抱負
m ishizaki
 
モバイルディスプレイ
モバイルディスプレイモバイルディスプレイ
モバイルディスプレイ
m ishizaki
 
Windows フォームアプリ 2022
Windows フォームアプリ 2022Windows フォームアプリ 2022
Windows フォームアプリ 2022
m ishizaki
 
dotnet tool
dotnet tooldotnet tool
dotnet tool
m ishizaki
 
C#10
C#10C#10
C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版
m ishizaki
 
C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内
m ishizaki
 
C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版
m ishizaki
 
秋葉原 C# もくもく会
秋葉原 C# もくもく会秋葉原 C# もくもく会
秋葉原 C# もくもく会
m ishizaki
 
C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25
m ishizaki
 

More from m ishizaki (20)

継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#
 
継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#
 
Visual Studio を使わず .NET する
Visual Studio を使わず .NET するVisual Studio を使わず .NET する
Visual Studio を使わず .NET する
 
Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話
 
「スタバ」する話
「スタバ」する話「スタバ」する話
「スタバ」する話
 
エンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについてエンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについて
 
Build 2022 / Uno Platform
Build 2022 / Uno PlatformBuild 2022 / Uno Platform
Build 2022 / Uno Platform
 
7 つの Blazor
7 つの Blazor7 つの Blazor
7 つの Blazor
 
C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版
 
仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話
 
2022 抱負
2022 抱負2022 抱負
2022 抱負
 
モバイルディスプレイ
モバイルディスプレイモバイルディスプレイ
モバイルディスプレイ
 
Windows フォームアプリ 2022
Windows フォームアプリ 2022Windows フォームアプリ 2022
Windows フォームアプリ 2022
 
dotnet tool
dotnet tooldotnet tool
dotnet tool
 
C#10
C#10C#10
C#10
 
C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版
 
C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内
 
C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版
 
秋葉原 C# もくもく会
秋葉原 C# もくもく会秋葉原 C# もくもく会
秋葉原 C# もくもく会
 
C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25
 

.NET Core 3.0 で使える C# 8

  • 1. / 34 .NET Core 3.0 で使える C# 8 1 城東.NET #37 2019年10月16日 石崎 充良
  • 2. / 34 自己紹介 石崎 充良 ( @mishi_cs ) Microsoft MVP for Developer Technologies 言語: C# XAML 活動: ・C# もくもく会 (connpass) ・C# Tokyo (connpass) 2
  • 4. / 34 C# 8 の新機能名 4
  • 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
  • 7. / 34 • 自動実装プロパティでないゲッターを呼ぶと警告(ゲッターが値を変更しないと限ら ないため) • ゲッターに readonly キーワードを付ければ OK 1. 読み取り専用メンバー 7
  • 8. / 34 • 警告の内容 • こんな場合に警告の出ているメソッド (例では .ToString() メソッド) を使ったタイミン グで point のコピーが作られる (インスタンスが一つ生まれる) 1. 読み取り専用メンバー 8 'readonly' メンバーから readonly 以外のメンバー 'Point.X.get' を呼び出すと、 'this' の暗黙のコピーが生成されます
  • 9. / 34 2. 既定のインターフェイス メンバー • インタフェースに実装ができる (ここでは Method2()) 9 実装クラス型の変数ではエラー インタフェース型変数は OK
  • 10. / 34 2. 既定のインターフェイス メンバー • 同名メソッドを持つ複数のインターフェイスを実装する場合 10 変数の型で決まる インターフェイス IB の 場合は 3 を返す
  • 11. / 34 2. 既定のインターフェイス メンバー • クラスで実装するとインターフェイス型でも実装クラスの実装が呼ばれる 11 Method2 の結果は全て 1 実装クラスでは 1 を返す
  • 12. / 34 3.1. switch 式 • パターンマッチングの switch が式なので結果が返る 12 switch の結果を 変数 val に入れられる
  • 13. / 34 3.2. プロパティのパターン • プロパティ値でマッチングできる 13 ワイルドカードは _ ここがマッチする
  • 14. / 34 3.2. プロパティのパターン • インスタンスやプロパティへのアクセスは最小限 14 何をしてもログを出すように 一回しか実行されていない
  • 15. / 34 • タプルの各値でマッチング 3.3. タプル パターン 15 ここにマッチする
  • 17. / 34 3.4. 位置指定パターン • 分解結果でマッチング 分解とは? 17 こんな Deconstruct メソッド (名前は固定) を作っておくと 代入でタプルにできる
  • 18. / 34 3.4. 位置指定パターン • 分解結果をタプルでマッチング 18 x や y が where やマッチした時の式で使える こんな風にも書けたが厳しい
  • 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
  • 26. / 34 9. インデックスと範囲 • インデックスを扱う型と演算子を追加 • 範囲を扱う型と演算子を追加 26 こんな書き方ができる [1..^0]
  • 27. / 34 9. インデックスと範囲 • インデックスを扱う型と演算子を追加 • System.Index 型 • index from end 演算子の ^ 27 演算子も Index 型 になる
  • 28. / 34 9. インデックスと範囲 • 範囲を扱う型と演算子を追加 • System.Range 型 • 範囲演算子の .. 28 演算子も Range 型 になる
  • 29. / 34 10. null 合体割り当て • ??= と書ける。+= と合わせて考えるとわかりやすい 29 += と同じ
  • 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> になる
  • 32. / 34 13. verbatim 補間文字列の拡張 • @$”” とも書ける。(これまでは $@”” だけ) 32
  • 34. / 34 まとめ • 時代は C# 8 • C# 8 は .NET Core 3.0 • .NET Core 3.0 今すぐダウンロード ( https://dotnet.microsoft.com/download ) 34