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

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 ネイティブライブラリラッピング入門伸男 伊藤
 
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返るHiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
tsudaa
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
koturn 0;
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
koturn 0;
 
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
 
getstartedc#_1
getstartedc#_1getstartedc#_1
getstartedc#_1
Ryuichi ITO
 
C++入門?
C++入門?C++入門?
C++入門?
tsudaa
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
道化師 堂華
 
Haxe vs Unicode
Haxe vs UnicodeHaxe vs Unicode
Haxe vs Unicode
Ryusei Yamaguchi
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語
gypsygypsy
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
和弘 井之上
 

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 ネイティブライブラリラッピング入門
 
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返るHiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
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
 
getstartedc#_1
getstartedc#_1getstartedc#_1
getstartedc#_1
 
C++入門?
C++入門?C++入門?
C++入門?
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
Ilerpg Study 003
Ilerpg Study 003Ilerpg Study 003
Ilerpg Study 003
 
Haxe vs Unicode
Haxe vs UnicodeHaxe vs Unicode
Haxe vs Unicode
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
 
C++の復習
C++の復習C++の復習
C++の復習
 

Similar to C# 8

C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
Fujio Kojima
 
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)
信之 岩永
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
Akira Takahashi
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Akira Inoue
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
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
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
Kiyoshi Ogawa
 
ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)
Hideki Okada
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Takuya Matsunaga
 
高位合成におけるC++テンプレートメタプログラミングの効果
高位合成におけるC++テンプレートメタプログラミングの効果高位合成におけるC++テンプレートメタプログラミングの効果
高位合成におけるC++テンプレートメタプログラミングの効果
Kenichiro MITSUDA
 
.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
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
信之 岩永
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
信之 岩永
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
nothingcosmos
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
和弘 井之上
 
C# 7・8 の復習
C# 7・8 の復習C# 7・8 の復習
C# 7・8 の復習
m ishizaki
 

Similar to C# 8 (20)

C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.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)
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
What is template
What is templateWhat is template
What is template
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
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...
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
 
高位合成におけるC++テンプレートメタプログラミングの効果
高位合成におけるC++テンプレートメタプログラミングの効果高位合成におけるC++テンプレートメタプログラミングの効果
高位合成におけるC++テンプレートメタプログラミングの効果
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
 
C# 7・8 の復習
C# 7・8 の復習C# 7・8 の復習
C# 7・8 の復習
 

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
 

Recently uploaded

クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
TatsuyaHanayama
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
You&I
 
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
You&I
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
yamamotominami
 

Recently uploaded (6)

クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
 
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
 

C# 8

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