SlideShare uma empresa Scribd logo
1 de 28
/ 27
C# 9 のおすすめ新機能
1
C# TOKYO オンライン LT 大会
2021年01月29日
石崎 充良
/ 27
自己紹介
石崎 充良 ( @mishi_cs )
Microsoft MVP for Developer Technologies
言語: C# XAML
活動:
・C# もくもく会 (connpass)
・C# Tokyo (connpass)
2
/ 27
座右の銘
良いアウトプットは
良い定時退社から
生まれる
3
/ 27
C# 9
4
/ 27
C# 7・8・9 の歴史
C# リリース ターゲット フレームワーク
7 2017/03 .NET Framework
8 2019/09 .NET Core 3.0
9 2020/11 .NET 5
5
/ 27
C# 7・8・9 の歴史
C# リリース ターゲット フレームワーク
7 2017/03 .NET Framework
8 2019/09 .NET Core 3.0
9 2020/11 .NET 5
6
/ 27
C# 9 の新機能一覧
•レコード
•init 専用セッター
•最上位レベルのステートメント
•パターン マッチングの拡張機能
•ターゲット型の新しい式
•ネイティブ サイズの整数
•関数ポインター
•localsinit フラグの出力を抑制する
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
•ローカル関数の属性
•ターゲットにより型指定された条件式
•部分メソッドの新機能
7
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9
※順番は変えています
/ 27
C# 9 の新機能一覧 – 分類
•レコード
•init 専用セッター
•最上位レベルのステートメント
•パターン マッチングの拡張機能
•ターゲット型の新しい式
•ネイティブ サイズの整数
•関数ポインター
•localsinit フラグの出力を抑制する
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
•ローカル関数の属性
•ターゲットにより型指定された条件式
•部分メソッドの新機能
8
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9
※順番は変えています
超! 人気の機能
話す人が多い(と思う)
unsafe とか
誰もが触る機能ではない
地味だったり
マイナーだったり
誰もが触る機能ではない
/ 27
C# 9 の新機能一覧 – 今日の話
•レコード
•init 専用セッター
•最上位レベルのステートメント
•パターン マッチングの拡張機能
•ターゲット型の新しい式
•ネイティブ サイズの整数
•関数ポインター
•localsinit フラグの出力を抑制する
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
•ローカル関数の属性
•ターゲットにより型指定された条件式
•部分メソッドの新機能
9
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9
※順番は変えています
誰もが使うがちょっと地味
今日はここを話します
/ 27
静的な匿名関数
10
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
/ 27
静的な匿名関数
匿名関数
11
ラムダ式
何がうれしいのか? エラーになってくれる
11
/ 27
共変の戻り値の型
12
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
/ 27
共変の戻り値の型 (1)
これまでは
return の型は変えられない
return の型が違っても次のコードは成立する
13
/ 27
共変の戻り値の型 (2)
これからは
14
これが書けるようになる
/ 27
ラムダ ディスカード
パラメーター
15
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
/ 27
ラムダ ディスカード パラメーター
return 値の破棄
16
使わない値は _ で破棄できる
ラムダ式の引数でも可能に
使わない引数は _ で破棄できる
いままでは
_ は有効な変数名なので名前の
衝突回避に __ と書いたり
_ や __ が普通に
使えたり
/ 27
モジュールの
初期化子
17
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
/ 27
モジュールの初期化子
18
モジュール側のコード アプリ側のコード
ModuleInitializer 属性のついた
メソッドが最初に実行される
Hello World!
Initialize
Saitama! Saitama!
実行結果
Initialize メソッドは呼んでいない
Saitama プロパティが呼ばれる前に
Initialize メソッドが実行されている
/ 27
今までは
19
ライブラリを使う際は
最初に Init メソッドを呼んで、
といったルールをユーザーに求めていたり
などしていた
/ 27
foreach ループの拡張機能
GetEnumerator サポート
20
•静的な匿名関数
•共変の戻り値の型
•ラムダ ディスカード パラメーター
•モジュールの初期化子
•foreach ループの拡張機能 GetEnumerator サポート
/ 27
コレクション初期化子 (1)
こんなことを良く書くと思います
21
/ 27
コレクション初期化子 (2)
Add メソッドが呼ばれます
22
a
b
c
実行結果
/ 27
拡張メソッドで Add メソッド
23
Add メソッドを持たないクラスで
拡張メソッドでも OK
/ 27
GetEnumerator 拡張メソッド
foreach できない型を foreach しようとしたときのエラー
24
foreach できない型に拡張メソッド GetEnumerator を作成
計画通り!
/ 27
まとめ
25
/ 27
C# 9 のおすすめ機能
26
地味ながら、使いこなすとソースコードがスマートになりミス
が減ります。
ミスが減れば、残業も減って定時退社も可能です。
定時退社しましょう!
•静 的 な 匿 名 関 数
•共 変 の 戻 り 値 の 型
•ラ ム ダ デ ィ ス カ ー ド パ ラ メ ー タ ー
•モ ジ ュ ー ル の 初 期 化 子
•f o r e a c h ル ー プ の 拡 張 機 能 G e t E n u m e r a t o r サ ポ ー ト
/ 27
その他の機能
ほかの機能は Web で!
27
https://rksoftware.hatenablog.com/entry/2020/11/09/024330
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9
/ 27
ありがとうございました。
28

Mais conteúdo relacionado

Mais procurados

C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
Akira Takahashi
 
型安全Printf作ってみた
型安全Printf作ってみた型安全Printf作ってみた
型安全Printf作ってみた
真一 北原
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 

Mais procurados (20)

final int をFINAL しやがれ!
final int をFINAL しやがれ!final int をFINAL しやがれ!
final int をFINAL しやがれ!
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
型安全Printf作ってみた
型安全Printf作ってみた型安全Printf作ってみた
型安全Printf作ってみた
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
Oss coding style
Oss coding styleOss coding style
Oss coding style
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
 
Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造
 
C言語講習会1
C言語講習会1C言語講習会1
C言語講習会1
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
 
C++ tips1 #include編
C++ tips1 #include編C++ tips1 #include編
C++ tips1 #include編
 
Effective Modern C++ Item 9 and 10
Effective Modern C++ Item 9 and 10Effective Modern C++ Item 9 and 10
Effective Modern C++ Item 9 and 10
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
 

Semelhante a C# 9 のおすすめ新機能

.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
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 

Semelhante a C# 9 のおすすめ新機能 (20)

【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# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
Bait and switch
Bait and switchBait and switch
Bait and switch
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
Netmf-180224
Netmf-180224Netmf-180224
Netmf-180224
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
ji-2. 計算
ji-2. 計算ji-2. 計算
ji-2. 計算
 
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみたADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口
 
.NETラボ2021年10月 .NETの過去と現在
.NETラボ2021年10月 .NETの過去と現在.NETラボ2021年10月 .NETの過去と現在
.NETラボ2021年10月 .NETの過去と現在
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
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)
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 

Mais de m ishizaki

Mais de 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
 

C# 9 のおすすめ新機能