SlideShare una empresa de Scribd logo
1 de 49
Copyright 2020 @nuits_jp
C#メタプログラミング概略 in 2021
Atsushi Nakamura
Copyright 2020 @nuits_jp Slide 2
C# 9.0と合わせて、Source Generatorがリリースされました。※
それに伴い、メタプログラミングが活性化しているように見えます。
※厳密にはC#9.0世代のプラットフォームで実現しているが、C#9.0の
機能ではない?
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9
実際、C#7.3(netstandard2.0世代)などを明示的に指定しても利用できる
Background
Copyright 2020 @nuits_jp Slide 3
そこで今回は
Copyright 2020 @nuits_jp Slide 4
C#で利用可能な代表的なメタプログラミング手法について
• どういったものが存在し
• どういう時に何をつかえばいいのか?
その大枠を整理してみました。
Today's Goal
Copyright 2020 @nuits_jp Slide 5
Attention!
Copyright 2020 @nuits_jp Slide 6
本日の内容は、発表のために改めて調査・整理したものです。
私自身、普段あまり接点のない技術もありますので、抜け漏れ誤りがあ
るかもしれません。
また、多分に主観が含まれています。
お気づきの点があれば、ぜひ気軽に「やさしく」ご指摘ください。
Attention!
Copyright 2020 @nuits_jp
C# Metaprogramming Overview
About Me
Copyright 2020 @nuits_jp Slide 8
About Me
中村 充志 / Atsushi Nakamura
• リコージャパン株式会社 所属
• Enterprise(おもに金融)系SIerのITアーキテクト
• 「持続可能なソフトウェア」の探求がライフワーク
• 2021年の目標
1. いろいろハンズオン開催したい
xUnit、FluentAssertions、Moq、TDD
2. 構成管理フレンドリーなERモデリングツール作成
• Blog http://www.nuits.jp
https://zenn.dev/nuits_jp
• Twitter @nuits_jp
Copyright 2020 @nuits_jp
C# Metaprogramming Overview
What is metaprogramming?
Copyright 2020 @nuits_jp Slide 10
What is metaprogramming?
メタプログラミングとは何か?
Wikipediaより
“プログラミング技法の一種で、ロジックを直接コーディングす
るのではなく、あるパターンをもったロジックを生成する高位ロ
ジックによってプログラミングを行う方法、またその高位ロジッ
クを定義する方法のこと。”
https://ja.wikipedia.org/wiki/メタプログラミング
Copyright 2020 @nuits_jp Slide 11
• データベースのテーブル定義からクラスを生成する
• クラス構造を解析してJSONへシリアライズ/デシリアライズする
• シリアライズ/デシリアライズする際に、フィールドやプロパティに
属性を指定することで制御する
つまり
「メタデータをもとに、プログラムを生成するプログラミング」
具体例
Copyright 2020 @nuits_jp Slide 12
.NETのメタプログラミング技術(多分もっとある)
1. CodeDOM
2. Roslyn(ここではNuGet上のライブラリ利用のこと)
3. Reflection
4. Reflection.Emit
5. ExpressionTree
6. T4TextTemplates
7. Source Generator ← New!!
8. Fody / Mono.Cecil
メタプログラミング
Copyright 2020 @nuits_jp Slide 13
本日扱う.NETのメタプログラミング技術
1. CodeDOM
2. Roslyn(ここではNuGet上のライブラリ利用のこと)
3. Reflection
4. Reflection.Emit
5. ExpressionTree
6. T4TextTemplates
7. Source Generator ← New!!
8. Fody / Mono.Cecil
メタプログラミング
Copyright 2020 @nuits_jp Slide 14
本日扱う.NETのメタプログラミング技術
1. Reflection
2. ExpressionTree
3. T4TextTemplates
4. Source Generator
5. Fody / Mono.Cecil
メタプログラミング
Copyright 2020 @nuits_jp Slide 15
どういう時に、何を使えばいいの?
Copyright 2020 @nuits_jp Slide 16
主要なユーザーストーリーパターンで分類すると、つぎのラインでわけ
ることができる
1. Reflection
2. ExpressionTree
3. T4TextTemplates
4. Fody / Mono.Cecil
5. Source Generator
メタプログラミング
Copyright 2020 @nuits_jp Slide 17
主要なユーザーストーリーパターンで分類すると、つぎのラインでわけ
ることができる
1. Reflection
2. ExpressionTree
3. T4TextTemplates
4. Fody / Mono.Cecil
5. Source Generator
メタプログラミング
自分自身のためのメタプログラミング
Copyright 2020 @nuits_jp Slide 18
主要なユーザーストーリーパターンで分類すると、つぎのラインでわけ
ることができる
1. Reflection
2. ExpressionTree
3. T4TextTemplates
4. Fody / Mono.Cecil
5. Source Generator
メタプログラミング
自分自身のためのメタプログラミング
自分を含む誰かのためのメタプログラミング
Copyright 2020 @nuits_jp Slide 19
項目 内容
実現技術 • Reflection
• ExpressionTree
具体例 • Dapper
• JSON⇔オブジェクト変換ライブラリなど
利用タイミング 実行時
説明 サードパーティライブラリ(Dapper)などが、機能提供を実現するために、内部で
メタプログラミングを利用しているパターン。
SQLの実行結果をオブジェクトに詰めたり、その逆を実現するために、動的にメタ
モデルを解析し、メンバーの値を取得したり設定したりするのに利用する。
自分自身のためのメタプログラミング
Copyright 2020 @nuits_jp Slide 20
項目 内容
実現技術 • T4Template
• Source Generator
• Fody / Mono.Cecil
具体例 • PropertyChanged.Fody
• UnitGenerator
利用タイミング 実行前(詳細は個別に異なる)
説明 前述の例に限定されず、使用可能な用途が広い。誰かには自分も含まれる。
現時点では、第三者が利用する定型的な実装(ボイラーコード)の自動生成に利用
されていることが多い。
WPFなどにINotifyPropertyChanged実装を提供するPropertyChanged.Fody。
ビジネスロジックにバリューオブジェクトを扱うための定型的な実装を提供する
UnitGeneratorなどが存在する。
ただし今後は、Dapperなどが自分で利用するコードのためにSourceGeneratorを利
用すると言ったケースが増えてくるのではないかと思われる。早いので。
誰かのためのメタプログラミング
Copyright 2020 @nuits_jp
C# Metaprogramming Overview
Implementation example
Copyright 2020 @nuits_jp Slide 22
本日のお題
Equalsのオーバーライドをサポートするライブラリを作成する。
値の比較はIdentifier属性の宣言されたプロパティで行う。
制限事項
• Identifier属性は1クラス1プロパティにしかない前提とする
• 対象はint型のみサポート
• 非Genericなクラスにのみ対応すればよい(Generic、struct非対応)
• GetHashCodeの実装は割愛する
https://github.com/nuitsjp/MetaprogrammingOverviewIn2021
Copyright 2020 @nuits_jp Slide 23
以下のコードと同じ振る舞いを、各メタプログラミング技術で実装する。
実装例
public class Customer
{
public int Code { get; set; }
public override bool Equals(object other)
{
if (other is Customer customer)
{
return Code.Equals(customer.Code);
}
return false;
}
}
Copyright 2020 @nuits_jp Slide 24
Reflection
Copyright 2020 @nuits_jp Slide 25
1. 圧倒的に簡単
2. 圧倒的に遅い
上記のような特徴があるため、速度がそれほど重要にならない、一度だ
け実行できればよい、何らかの処理を自動化するためのツールなどで使
い勝手が良い。
Reflectionの特徴
Copyright 2020 @nuits_jp Slide 26
No. 実装 実行時間
1 Not metaprogramming 2.798 ns
2 Reflection 2,891.742 ns
3 Reflection with Cache
4 ExpressionTree
5 ExpressionTree with Cache
6 T4Template
7 Source Generator
8 Fody
ざっと1,000倍!
(とは言え0.002ミリ秒)
Copyright 2020 @nuits_jp Slide 27
Reflection with Cache
Copyright 2020 @nuits_jp Slide 28
No. 実装 実行時間
1 Not metaprogramming 2.798 ns
2 Reflection 2,891.742 ns
3 Reflection with Cache 214.812 ns
4 ExpressionTree
5 ExpressionTree with Cache
6 T4Template
7 Source Generator
8 Fody
Reflection with Cache
Copyright 2020 @nuits_jp Slide 29
• 全体の処理の90%を占めるコードを回避できる
• 繰り返し実行すればするほど効果が高い
• StaticType Cachingパターンがハマりやすい
Reflection with Cache
Copyright 2020 @nuits_jp Slide 30
ExpressionTree
Copyright 2020 @nuits_jp Slide 31
No. 実装 実行時間
1 Not metaprogramming 2.798 ns
2 Reflection 2,891.742 ns
3 Reflection with Cache 214.812 ns
4 ExpressionTree 85,835.928 ns
5 ExpressionTree with Cache
6 T4Template
7 Source Generator
8 Fody
ExpressionTree
Compileが非常に遅い
Copyright 2020 @nuits_jp Slide 32
ExpressionTree with Cache
Copyright 2020 @nuits_jp Slide 33
No. 実装 実行時間
1 Not metaprogramming 2.798 ns
2 Reflection 2,891.742 ns
3 Reflection with Cache 214.812 ns
4 ExpressionTree 85,835.928 ns
5 ExpressionTree with Cache 7.914 ns
6 T4Template
7 Source Generator
8 Fody
ExpressionTree with Cache
Copyright 2020 @nuits_jp Slide 34
• Notメタプログラミングと、おおむね同等といってよい
(nsの世界なので)
• ExpressionTreeはキャッシングとセット
• キャッシングしないならReflectionでいい
• このため型変換系(ORMや通信)のライブラリで使い勝手が良い
• やはりStaticType Cachingパターンがハマりやすい
ExpressionTree with Cache
Copyright 2020 @nuits_jp Slide 35
T4Template
Copyright 2020 @nuits_jp Slide 36
No. 実装 実行時間
1 Not metaprogramming 2.798 ns
2 Reflection 2,891.742 ns
3 Reflection with Cache 214.812 ns
4 ExpressionTree 85,835.928 ns
5 ExpressionTree with Cache 7.914 ns
6 T4Template 2.251 ns
7 Source Generator
8 Fody
T4Template
Copyright 2020 @nuits_jp Slide 37
• 速度は非メタプログラミングと完全に同等(当たり前)
• ちょっと癖がある
• 本来生成コードは構成管理したくない
• レビューやテスト(の特にカバレージチェック)に悪影響
• コード生成する対象コードが増えても、自動生成されない点に特
に注意(削除時は生成コードを一度削除しないとダメ?)
• ライブラリとして再配布する場合「利用者が」理解して使う必要有
• IDE依存でCI/CD時に生成は大変(VS、VS for Max、Riderが対応)
• でも複雑なコード生成も、すごく簡単(多分一番簡単)
T4Template
Copyright 2020 @nuits_jp Slide 38
Source Generator
Copyright 2020 @nuits_jp Slide 39
No. 実装 実行時間
1 Not metaprogramming 2.798 ns
2 Reflection 2,891.742 ns
3 Reflection with Cache 214.812 ns
4 ExpressionTree 85,835.928 ns
5 ExpressionTree with Cache 7.914 ns
6 T4Template 2.251 ns
7 Source Generator 2.259 ns
8 Fody
Source Generator
Copyright 2020 @nuits_jp Slide 40
• やはり速度は非メタプログラミングと完全に同等(当たり前)
• ソースはメモリ展開されてコンパイルされる
• でもデバッグはできちゃう
• そのため利用者に「理解を求める」必要がなく再配布しやすい
• 上記の理由から、今後例えばDapperやJSON変換のようなライブラリ
などで、型変換コードがSource Generatorへ移行していく可能性があ
る?しらんけど・・・
• Analyzerとの相性も良く、利用者に使いやすいものを作りやすい
• 実は生成コードのテンプレートにT4がすごく使いやすい
• IDE非依存なので、CI/CDなんかでも使いやすい
Source Generator
Copyright 2020 @nuits_jp Slide 41
Fody
Copyright 2020 @nuits_jp Slide 42
No. 実装 実行時間
1 Not metaprogramming 2.798 ns
2 Reflection 2,891.742 ns
3 Reflection with Cache 214.812 ns
4 ExpressionTree 85,835.928 ns
5 ExpressionTree with Cache 7.914 ns
6 T4Template 2.251 ns
7 Source Generator 2.259 ns
8 Fody 2.584 ns
Fody
Copyright 2020 @nuits_jp Slide 43
• 他と比較して、既存コードの改変が行えるのが最大の特徴
• AOP的な実装をするのにコード改変が必要なことがある
• 例)既存メソッドにトラッキングコードを埋め込む
• 例)例外時のリトライ処理を定型的に埋め込む
• 逆にいうと、ほかの手段で可能なことはやらない方がいい
• 学習コストが高い(類似性のない新言語を1つ覚えるに等しい)
• 単純に生産性が非常に低い
• 1例としてSource Generator比の3倍のソースコード
• 品質の確保も困難
• 1例としてSource Generatorの16倍のテストケース
Fody
Copyright 2020 @nuits_jp
C# Metaprogramming Overview
まとめ
Copyright 2020 @nuits_jp Slide 45
IComparableのボイラーコードを生成するライブラリを作ってるので、
完成したらよかったら使ってね!
https://github.com/nuitsjp/ComparableGenerator
まとめ
Copyright 2020 @nuits_jp Slide 46
じゃなかった
Copyright 2020 @nuits_jp Slide 47
.NETのメタプログラミング技術(多分もっとある)
1. CodeDOM
2. Roslyn(ここではNuGet上のライブラリ利用のこと)
3. Reflection
4. Reflection.Emit
5. ExpressionTree
6. T4TextTemplates
7. Source Generator ← New!!
8. Fody / Mono.Cecil
メタプログラミング
Copyright 2020 @nuits_jp Slide 48
• それぞれ適材適所
• いつものとおり、銀の弾丸はない
• 向いているものを、向いている場所で使いましょう
• 特に!IL弄るのは最終手段
注意点
Copyright 2020 @nuits_jp Slide 49
ThankYou!
おしまい!

Más contenido relacionado

La actualidad más candente

Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
.NET 7期待の新機能
.NET 7期待の新機能.NET 7期待の新機能
.NET 7期待の新機能TomomitsuKusaba
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外Takuya Sato
 
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜KLab Inc. / Tech
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理KageShiron
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 
サムライスピリッツキャラクター制作事例 キャラクターモデル編
 サムライスピリッツキャラクター制作事例 キャラクターモデル編 サムライスピリッツキャラクター制作事例 キャラクターモデル編
サムライスピリッツキャラクター制作事例 キャラクターモデル編SNK
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術dena_study
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
Iocコンテナについて
IocコンテナについてIocコンテナについて
IocコンテナについてAkio Terayama
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチYoshiki Hayama
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす増田 亨
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込むYoshiki Hayama
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターンTakashi Komada
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 

La actualidad más candente (20)

Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
.NET 7期待の新機能
.NET 7期待の新機能.NET 7期待の新機能
.NET 7期待の新機能
 
世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
 
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
サムライスピリッツキャラクター制作事例 キャラクターモデル編
 サムライスピリッツキャラクター制作事例 キャラクターモデル編 サムライスピリッツキャラクター制作事例 キャラクターモデル編
サムライスピリッツキャラクター制作事例 キャラクターモデル編
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
Unityと.NET
Unityと.NETUnityと.NET
Unityと.NET
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
Iocコンテナについて
IocコンテナについてIocコンテナについて
Iocコンテナについて
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターン
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 

Similar a C#メタプログラミング概略 in 2021

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理Kouji Matsui
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Atsushi Nakamura
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今Yuki Igarashi
 
新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ慎一 古賀
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#Yuta Matsumura
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
Unity/CSharp 1 - pptx
Unity/CSharp 1 - pptxUnity/CSharp 1 - pptx
Unity/CSharp 1 - pptxtagawakiyoshi
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)NTT DATA Technology & Innovation
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)NTT DATA Technology & Innovation
 
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Kazumi IWANAGA
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発m ishizaki
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMFAtomu Hidaka
 
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み慎一 古賀
 
Visual Studio を使わず .NET する
Visual Studio を使わず .NET するVisual Studio を使わず .NET する
Visual Studio を使わず .NET するm ishizaki
 
Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料Masaki Muranaka
 

Similar a C#メタプログラミング概略 in 2021 (20)

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今
 
新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
Cocos2d platforms
Cocos2d platformsCocos2d platforms
Cocos2d platforms
 
Unity/CSharp 1 - pptx
Unity/CSharp 1 - pptxUnity/CSharp 1 - pptx
Unity/CSharp 1 - pptx
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
The evolution of c#
The evolution of c#The evolution of c#
The evolution of c#
 
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
 
Hacktoberfest 概要、Node-REDプロジェクト貢献手順
Hacktoberfest 概要、Node-REDプロジェクト貢献手順Hacktoberfest 概要、Node-REDプロジェクト貢献手順
Hacktoberfest 概要、Node-REDプロジェクト貢献手順
 
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
運用管理者のための「開発者からみたDevOps」 - Visual Studio 2015 新機能から考える開発者の取り組み
 
Visual Studio を使わず .NET する
Visual Studio を使わず .NET するVisual Studio を使わず .NET する
Visual Studio を使わず .NET する
 
Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料
 
Unity/CSharp 3
Unity/CSharp 3Unity/CSharp 3
Unity/CSharp 3
 

Más de Atsushi Nakamura

Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトSettings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトAtsushi Nakamura
 
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Atsushi Nakamura
 
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョンAtsushi Nakamura
 
世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-previewAtsushi Nakamura
 
世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1Atsushi Nakamura
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Atsushi Nakamura
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考えるAtsushi Nakamura
 
継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版Atsushi Nakamura
 
α版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるα版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるAtsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そうAtsushi Nakamura
 
Old:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうOld:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうAtsushi Nakamura
 
Xamarin.forms navigation overview
Xamarin.forms navigation overviewXamarin.forms navigation overview
Xamarin.forms navigation overviewAtsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そうAtsushi Nakamura
 
Blue monkey architecture overview
Blue monkey architecture overviewBlue monkey architecture overview
Blue monkey architecture overviewAtsushi Nakamura
 
Xamarin Dev days 2 xamarin.forms ja
Xamarin Dev days 2   xamarin.forms jaXamarin Dev days 2   xamarin.forms ja
Xamarin Dev days 2 xamarin.forms jaAtsushi Nakamura
 
Why prism for xamarin.forms
Why prism for xamarin.formsWhy prism for xamarin.forms
Why prism for xamarin.formsAtsushi Nakamura
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Atsushi Nakamura
 

Más de Atsushi Nakamura (17)

Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトSettings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
 
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
 
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
 
世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview
 
世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える
 
継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版
 
α版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるα版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考える
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
 
Old:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうOld:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そう
 
Xamarin.forms navigation overview
Xamarin.forms navigation overviewXamarin.forms navigation overview
Xamarin.forms navigation overview
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
 
Blue monkey architecture overview
Blue monkey architecture overviewBlue monkey architecture overview
Blue monkey architecture overview
 
Xamarin Dev days 2 xamarin.forms ja
Xamarin Dev days 2   xamarin.forms jaXamarin Dev days 2   xamarin.forms ja
Xamarin Dev days 2 xamarin.forms ja
 
Why prism for xamarin.forms
Why prism for xamarin.formsWhy prism for xamarin.forms
Why prism for xamarin.forms
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性
 

Último

Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)keikoitakurag
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521Satoshi Makita
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑Akihiro Kadohata
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdfAyachika Kitazaki
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイントonozaty
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayersToru Tamaki
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )iwashiira2ctf
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptxssuserbefd24
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose EstimationToru Tamaki
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員Sadaomi Nishi
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計atsushi061452
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一瑛一 西口
 

Último (12)

Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 

C#メタプログラミング概略 in 2021

  • 2. Copyright 2020 @nuits_jp Slide 2 C# 9.0と合わせて、Source Generatorがリリースされました。※ それに伴い、メタプログラミングが活性化しているように見えます。 ※厳密にはC#9.0世代のプラットフォームで実現しているが、C#9.0の 機能ではない? https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9 実際、C#7.3(netstandard2.0世代)などを明示的に指定しても利用できる Background
  • 3. Copyright 2020 @nuits_jp Slide 3 そこで今回は
  • 4. Copyright 2020 @nuits_jp Slide 4 C#で利用可能な代表的なメタプログラミング手法について • どういったものが存在し • どういう時に何をつかえばいいのか? その大枠を整理してみました。 Today's Goal
  • 5. Copyright 2020 @nuits_jp Slide 5 Attention!
  • 6. Copyright 2020 @nuits_jp Slide 6 本日の内容は、発表のために改めて調査・整理したものです。 私自身、普段あまり接点のない技術もありますので、抜け漏れ誤りがあ るかもしれません。 また、多分に主観が含まれています。 お気づきの点があれば、ぜひ気軽に「やさしく」ご指摘ください。 Attention!
  • 7. Copyright 2020 @nuits_jp C# Metaprogramming Overview About Me
  • 8. Copyright 2020 @nuits_jp Slide 8 About Me 中村 充志 / Atsushi Nakamura • リコージャパン株式会社 所属 • Enterprise(おもに金融)系SIerのITアーキテクト • 「持続可能なソフトウェア」の探求がライフワーク • 2021年の目標 1. いろいろハンズオン開催したい xUnit、FluentAssertions、Moq、TDD 2. 構成管理フレンドリーなERモデリングツール作成 • Blog http://www.nuits.jp https://zenn.dev/nuits_jp • Twitter @nuits_jp
  • 9. Copyright 2020 @nuits_jp C# Metaprogramming Overview What is metaprogramming?
  • 10. Copyright 2020 @nuits_jp Slide 10 What is metaprogramming? メタプログラミングとは何か? Wikipediaより “プログラミング技法の一種で、ロジックを直接コーディングす るのではなく、あるパターンをもったロジックを生成する高位ロ ジックによってプログラミングを行う方法、またその高位ロジッ クを定義する方法のこと。” https://ja.wikipedia.org/wiki/メタプログラミング
  • 11. Copyright 2020 @nuits_jp Slide 11 • データベースのテーブル定義からクラスを生成する • クラス構造を解析してJSONへシリアライズ/デシリアライズする • シリアライズ/デシリアライズする際に、フィールドやプロパティに 属性を指定することで制御する つまり 「メタデータをもとに、プログラムを生成するプログラミング」 具体例
  • 12. Copyright 2020 @nuits_jp Slide 12 .NETのメタプログラミング技術(多分もっとある) 1. CodeDOM 2. Roslyn(ここではNuGet上のライブラリ利用のこと) 3. Reflection 4. Reflection.Emit 5. ExpressionTree 6. T4TextTemplates 7. Source Generator ← New!! 8. Fody / Mono.Cecil メタプログラミング
  • 13. Copyright 2020 @nuits_jp Slide 13 本日扱う.NETのメタプログラミング技術 1. CodeDOM 2. Roslyn(ここではNuGet上のライブラリ利用のこと) 3. Reflection 4. Reflection.Emit 5. ExpressionTree 6. T4TextTemplates 7. Source Generator ← New!! 8. Fody / Mono.Cecil メタプログラミング
  • 14. Copyright 2020 @nuits_jp Slide 14 本日扱う.NETのメタプログラミング技術 1. Reflection 2. ExpressionTree 3. T4TextTemplates 4. Source Generator 5. Fody / Mono.Cecil メタプログラミング
  • 15. Copyright 2020 @nuits_jp Slide 15 どういう時に、何を使えばいいの?
  • 16. Copyright 2020 @nuits_jp Slide 16 主要なユーザーストーリーパターンで分類すると、つぎのラインでわけ ることができる 1. Reflection 2. ExpressionTree 3. T4TextTemplates 4. Fody / Mono.Cecil 5. Source Generator メタプログラミング
  • 17. Copyright 2020 @nuits_jp Slide 17 主要なユーザーストーリーパターンで分類すると、つぎのラインでわけ ることができる 1. Reflection 2. ExpressionTree 3. T4TextTemplates 4. Fody / Mono.Cecil 5. Source Generator メタプログラミング 自分自身のためのメタプログラミング
  • 18. Copyright 2020 @nuits_jp Slide 18 主要なユーザーストーリーパターンで分類すると、つぎのラインでわけ ることができる 1. Reflection 2. ExpressionTree 3. T4TextTemplates 4. Fody / Mono.Cecil 5. Source Generator メタプログラミング 自分自身のためのメタプログラミング 自分を含む誰かのためのメタプログラミング
  • 19. Copyright 2020 @nuits_jp Slide 19 項目 内容 実現技術 • Reflection • ExpressionTree 具体例 • Dapper • JSON⇔オブジェクト変換ライブラリなど 利用タイミング 実行時 説明 サードパーティライブラリ(Dapper)などが、機能提供を実現するために、内部で メタプログラミングを利用しているパターン。 SQLの実行結果をオブジェクトに詰めたり、その逆を実現するために、動的にメタ モデルを解析し、メンバーの値を取得したり設定したりするのに利用する。 自分自身のためのメタプログラミング
  • 20. Copyright 2020 @nuits_jp Slide 20 項目 内容 実現技術 • T4Template • Source Generator • Fody / Mono.Cecil 具体例 • PropertyChanged.Fody • UnitGenerator 利用タイミング 実行前(詳細は個別に異なる) 説明 前述の例に限定されず、使用可能な用途が広い。誰かには自分も含まれる。 現時点では、第三者が利用する定型的な実装(ボイラーコード)の自動生成に利用 されていることが多い。 WPFなどにINotifyPropertyChanged実装を提供するPropertyChanged.Fody。 ビジネスロジックにバリューオブジェクトを扱うための定型的な実装を提供する UnitGeneratorなどが存在する。 ただし今後は、Dapperなどが自分で利用するコードのためにSourceGeneratorを利 用すると言ったケースが増えてくるのではないかと思われる。早いので。 誰かのためのメタプログラミング
  • 21. Copyright 2020 @nuits_jp C# Metaprogramming Overview Implementation example
  • 22. Copyright 2020 @nuits_jp Slide 22 本日のお題 Equalsのオーバーライドをサポートするライブラリを作成する。 値の比較はIdentifier属性の宣言されたプロパティで行う。 制限事項 • Identifier属性は1クラス1プロパティにしかない前提とする • 対象はint型のみサポート • 非Genericなクラスにのみ対応すればよい(Generic、struct非対応) • GetHashCodeの実装は割愛する https://github.com/nuitsjp/MetaprogrammingOverviewIn2021
  • 23. Copyright 2020 @nuits_jp Slide 23 以下のコードと同じ振る舞いを、各メタプログラミング技術で実装する。 実装例 public class Customer { public int Code { get; set; } public override bool Equals(object other) { if (other is Customer customer) { return Code.Equals(customer.Code); } return false; } }
  • 24. Copyright 2020 @nuits_jp Slide 24 Reflection
  • 25. Copyright 2020 @nuits_jp Slide 25 1. 圧倒的に簡単 2. 圧倒的に遅い 上記のような特徴があるため、速度がそれほど重要にならない、一度だ け実行できればよい、何らかの処理を自動化するためのツールなどで使 い勝手が良い。 Reflectionの特徴
  • 26. Copyright 2020 @nuits_jp Slide 26 No. 実装 実行時間 1 Not metaprogramming 2.798 ns 2 Reflection 2,891.742 ns 3 Reflection with Cache 4 ExpressionTree 5 ExpressionTree with Cache 6 T4Template 7 Source Generator 8 Fody ざっと1,000倍! (とは言え0.002ミリ秒)
  • 27. Copyright 2020 @nuits_jp Slide 27 Reflection with Cache
  • 28. Copyright 2020 @nuits_jp Slide 28 No. 実装 実行時間 1 Not metaprogramming 2.798 ns 2 Reflection 2,891.742 ns 3 Reflection with Cache 214.812 ns 4 ExpressionTree 5 ExpressionTree with Cache 6 T4Template 7 Source Generator 8 Fody Reflection with Cache
  • 29. Copyright 2020 @nuits_jp Slide 29 • 全体の処理の90%を占めるコードを回避できる • 繰り返し実行すればするほど効果が高い • StaticType Cachingパターンがハマりやすい Reflection with Cache
  • 30. Copyright 2020 @nuits_jp Slide 30 ExpressionTree
  • 31. Copyright 2020 @nuits_jp Slide 31 No. 実装 実行時間 1 Not metaprogramming 2.798 ns 2 Reflection 2,891.742 ns 3 Reflection with Cache 214.812 ns 4 ExpressionTree 85,835.928 ns 5 ExpressionTree with Cache 6 T4Template 7 Source Generator 8 Fody ExpressionTree Compileが非常に遅い
  • 32. Copyright 2020 @nuits_jp Slide 32 ExpressionTree with Cache
  • 33. Copyright 2020 @nuits_jp Slide 33 No. 実装 実行時間 1 Not metaprogramming 2.798 ns 2 Reflection 2,891.742 ns 3 Reflection with Cache 214.812 ns 4 ExpressionTree 85,835.928 ns 5 ExpressionTree with Cache 7.914 ns 6 T4Template 7 Source Generator 8 Fody ExpressionTree with Cache
  • 34. Copyright 2020 @nuits_jp Slide 34 • Notメタプログラミングと、おおむね同等といってよい (nsの世界なので) • ExpressionTreeはキャッシングとセット • キャッシングしないならReflectionでいい • このため型変換系(ORMや通信)のライブラリで使い勝手が良い • やはりStaticType Cachingパターンがハマりやすい ExpressionTree with Cache
  • 35. Copyright 2020 @nuits_jp Slide 35 T4Template
  • 36. Copyright 2020 @nuits_jp Slide 36 No. 実装 実行時間 1 Not metaprogramming 2.798 ns 2 Reflection 2,891.742 ns 3 Reflection with Cache 214.812 ns 4 ExpressionTree 85,835.928 ns 5 ExpressionTree with Cache 7.914 ns 6 T4Template 2.251 ns 7 Source Generator 8 Fody T4Template
  • 37. Copyright 2020 @nuits_jp Slide 37 • 速度は非メタプログラミングと完全に同等(当たり前) • ちょっと癖がある • 本来生成コードは構成管理したくない • レビューやテスト(の特にカバレージチェック)に悪影響 • コード生成する対象コードが増えても、自動生成されない点に特 に注意(削除時は生成コードを一度削除しないとダメ?) • ライブラリとして再配布する場合「利用者が」理解して使う必要有 • IDE依存でCI/CD時に生成は大変(VS、VS for Max、Riderが対応) • でも複雑なコード生成も、すごく簡単(多分一番簡単) T4Template
  • 38. Copyright 2020 @nuits_jp Slide 38 Source Generator
  • 39. Copyright 2020 @nuits_jp Slide 39 No. 実装 実行時間 1 Not metaprogramming 2.798 ns 2 Reflection 2,891.742 ns 3 Reflection with Cache 214.812 ns 4 ExpressionTree 85,835.928 ns 5 ExpressionTree with Cache 7.914 ns 6 T4Template 2.251 ns 7 Source Generator 2.259 ns 8 Fody Source Generator
  • 40. Copyright 2020 @nuits_jp Slide 40 • やはり速度は非メタプログラミングと完全に同等(当たり前) • ソースはメモリ展開されてコンパイルされる • でもデバッグはできちゃう • そのため利用者に「理解を求める」必要がなく再配布しやすい • 上記の理由から、今後例えばDapperやJSON変換のようなライブラリ などで、型変換コードがSource Generatorへ移行していく可能性があ る?しらんけど・・・ • Analyzerとの相性も良く、利用者に使いやすいものを作りやすい • 実は生成コードのテンプレートにT4がすごく使いやすい • IDE非依存なので、CI/CDなんかでも使いやすい Source Generator
  • 41. Copyright 2020 @nuits_jp Slide 41 Fody
  • 42. Copyright 2020 @nuits_jp Slide 42 No. 実装 実行時間 1 Not metaprogramming 2.798 ns 2 Reflection 2,891.742 ns 3 Reflection with Cache 214.812 ns 4 ExpressionTree 85,835.928 ns 5 ExpressionTree with Cache 7.914 ns 6 T4Template 2.251 ns 7 Source Generator 2.259 ns 8 Fody 2.584 ns Fody
  • 43. Copyright 2020 @nuits_jp Slide 43 • 他と比較して、既存コードの改変が行えるのが最大の特徴 • AOP的な実装をするのにコード改変が必要なことがある • 例)既存メソッドにトラッキングコードを埋め込む • 例)例外時のリトライ処理を定型的に埋め込む • 逆にいうと、ほかの手段で可能なことはやらない方がいい • 学習コストが高い(類似性のない新言語を1つ覚えるに等しい) • 単純に生産性が非常に低い • 1例としてSource Generator比の3倍のソースコード • 品質の確保も困難 • 1例としてSource Generatorの16倍のテストケース Fody
  • 44. Copyright 2020 @nuits_jp C# Metaprogramming Overview まとめ
  • 45. Copyright 2020 @nuits_jp Slide 45 IComparableのボイラーコードを生成するライブラリを作ってるので、 完成したらよかったら使ってね! https://github.com/nuitsjp/ComparableGenerator まとめ
  • 46. Copyright 2020 @nuits_jp Slide 46 じゃなかった
  • 47. Copyright 2020 @nuits_jp Slide 47 .NETのメタプログラミング技術(多分もっとある) 1. CodeDOM 2. Roslyn(ここではNuGet上のライブラリ利用のこと) 3. Reflection 4. Reflection.Emit 5. ExpressionTree 6. T4TextTemplates 7. Source Generator ← New!! 8. Fody / Mono.Cecil メタプログラミング
  • 48. Copyright 2020 @nuits_jp Slide 48 • それぞれ適材適所 • いつものとおり、銀の弾丸はない • 向いているものを、向いている場所で使いましょう • 特に!IL弄るのは最終手段 注意点
  • 49. Copyright 2020 @nuits_jp Slide 49 ThankYou! おしまい!

Notas del editor

  1. それでは始めます。 よろしくお願いします。
  2. さてC#9.0のリリースとあわせて、Source Generatorがリリースされましたね。 昨今、一部でメタプログラミングが活性化しているように、個人的には感じています。
  3. そこで今回は
  4. C#で利用可能な代表的なメタプログラミングについて どういったものが存在し どういうときに、何を使えばいいのか? その大枠を整理してみました。
  5. 1点ご注意いただきたいことがあります。
  6. 今回の発表内容について 抜け漏れ誤りがあるかもしれませんし 多分に主観が含まれています。 お気づきの点がありましたら、ぜひ気軽にかつ「やさしく」ご指摘ください。
  7. では本題の前に、自己紹介を。
  8. 中村充志と申します。 リコージャパンという会社に所属して 金融系のエンプラ界隈でアーキテクトをやっています。 ブログやTwitterやってますので、フォローしてもらえると喜びます。
  9. では本題へ。 まず、はじめに メタプログラミングとはなにか?おさらいしましょう。
  10. Wikipedia様によると
  11. たとえば、データベース構造からクラスを生成したり クラスを構造解析してJSONへシリアライズしたり つまり、メタデータをもとに、プログラムを生成するプログラミングのことをメタプログラミングと呼びます。
  12. .NETの代表的なメタプログラミングを集めてみました。 皆さんの推しが入っていなかったらゴメンなさい。 Source Generatorが追加されたのがトピックですね。 今回はこれらのうち
  13. この辺は除外させていただいて
  14. この5つについてお話します。
  15. まずは、どういうときに、何をつかえばいいのか? から、お話しましょう。
  16. その際、このラインで区切って考えると分かりやすいです。
  17. 上は、基本的に自分自身のためにメタプログラミングする技法で
  18. それ以外は、自分を含む、誰かのために利用します。 うん、わからん。
  19. 前者について 例えばDapperなどが 実行時に SQLの実行結果をオブジェクトにつめたり、その逆を実現するために 動的に構造解析して、メンバを取得したり設定したりするのに 利用される技術です。
  20. 後者は、前者のように限定されず、使用用途が非常に広いです。 現時点では、定型的実装つまりボイラーコードの自動生成に 利用されているのをよく見かけます。 たとえば、WPF向けにINotifyPropertyChangedの実装を自動的に生成したり DDDするためのバリューオブジェクトの典型的な実装を提供したりです。 実行前に解決されるため、動作が非常に軽快です。 これまで、これ系のメタプログラミングは、ちょっと癖が強かったのですが Source Generatorはその辺りがだいぶ解消されています。 そのため、今後は、Dapperみたいなライブラリが、自分で利用するコードのために Source Generatorを利用するといったケースも増えてくるかもしれません。
  21. ということで、実際のサンプルを見ていきましょう。
  22. 今回はEqualsのオーバーライドをサポートするライブラリをお題とします。 Identifier属性を宣言されたプロパティで同値比較します。 これをまじめに作ると、結構なボリュームになってしまうので 記載しているような制約を前提とします。 今回、時間の兼ね合いで、コードはざっとだけお見せします。 詳細はGithubに公開しているので、良かったらご覧ください。
  23. こんな参照じゃなくて、内部のメンバーで比較するコードを いろんな手法で生成します。
  24. てことで、まずはReflectionからいきましょう! ソリューションを開くと、こんな感じで実装技術ごとにフォルダに分けられて整理されています。 一番上は、Notメタなコードです。 Reflectionは二番目ですね。 開くと、3つプロジェクトがあります。 だいたい、どの実装技術も同じ構成です。 まず実装技術名のプロジェクトがあって、こちらに構文解析される側のコードが入っています。 CustomerとEmployeeがありますね。 ReflectionではこれらでEqualsをオーバーライドして、内部からEqualsクラスのInvokeに 処理を委譲しています。 この実装は、メタプログラミングとついているプロジェクトに含まれています。 中をみると、TypeからIdentifier属性が付いているプロパティインフォを取得しているのが見て取れます。 取得したプロパティインフォを使って、値比較するプロパティの値を取得しています。 PPTXへ
  25. さてご覧いただいたように、Reflectionは実装が簡単です。 半面、動作速度が遅いです。 そのため、一度だけ実行すればよい自動化ツールの作成なんかで使い勝手が良いです ちなみにどれくらい遅いかというと、今回のコードで
  26. ざっと1000倍くらい遅いです。 とは言え、単位なナノセコンドなので、使えない遅さという話ではないです。
  27. ただ、これは改善の余地があって 構造解析のコードをキャッシングすることで性能を改善できます。 実際にコードを見てみましょう。 VSへ Customerコードは同じです。 EqualsのInvokeの実装が異なります。 内部でキャッシュされたInstanceオブジェクトのInvokeInnerメソッドを呼び出しています。 その中では、先ほどのプロパティインフォを取得するコードが含まれていませんね。 こんな感じでキャッシュを使いまわします。 詳細は気になる人は、Githubをご覧ください。 で、実行速度はというと PPTXへ
  28. だいたい10分の1くらいになりました。
  29. これは、繰り返し実行すればするほど、差が大きくなります。 Genericな実装でキャッシングを実行する場合、 Static Type Cachingパターンが非常にはまりやすいので ぜひ活用を検討してください。
  30. 続いてExpression Treeです。 実際に動的メタプログラミングではこれが利用されているケースが非常に多いです。 VSへ CustomerコードはReflectionと全く同一です。 実装を見てみるとなんだか少し違いますね。 Expressionというのを組み立てて、最後にCompileしてラムダを生成しています。 このラムダを値の取得に利用します。 さて、この実行速度なのですが PPTXへ
  31. めっちゃ遅いです! これは実行の都度、Compileが走っているからです。
  32. ということでReflectionと同じようにキャッシングすると
  33. 劇的に早くすることができます。
  34. ナノセコンドの世界ですので、ノットメタな世界とおおむね同等といっていいと思います。 Expression Treeは基本的にキャッシングとセットで使いましょう。 こういった特徴があるので、型変換を伴うORMや通信系のライブラリと相性が非常によいです。
  35. 続いてT4テンプレートです。 VSへ T4だけ、メタプログラミングとつくプロジェクトがありません。 これはT4はCustomerのコードと同じプロジェクト内に.ttファイルを配置する必要があるからです。 中身を見てみましょう。 ASP.NETのRazerにもにた、普通のテンプレート構文なファイルですね。 詳細は割愛しますが、このDTEというのが、Visual Studioを表すオブジェクトで そこから含まれるコードのメタ情報を取得します。 この下に、Equalsのコードが生成されます。 これを実行すると PPTXへ
  36. 当たり前ですが、非常に速いです。
  37. 非メタな実装と完全に同等です。 ただ、いろいろ癖がありまして・・・ 本来自動生成するコードは構成管理したくないですよね。 PRにのってきちゃうと、レビューが大変ですし、テストカバレージの扱いにも困ります。 また、コード生成する対象コードが増減しても、自動的に追従してくれないって問題もあります。 VSへ たとえば、Itemクラス、コメントアウトされていなものを外してコンパイルしても・・・ 生成されません。 T4ファイルを保存するか、右クリから実行すると作成されます。 削除するときは右クリ実行しても、こんな中途半端な形で生成されるので 一度全部消してから再生成します。 PPTX 特に最後の問題は、再配布して利用する場合に、利用者がその特徴を理解して使わないといけなかったりするのが困りごとです。 またIDE依存なのでCI/CD時に生成ということができません。 でも、複雑なコード生成も、ものすごく簡単にできちゃうというメリットがあります。
  38. つぎはいよいよソースジェネレーターです Customerクラスはこれまで同様です。 メタプロ側のプロジェクトの中のSourceGenerator.csでソース生成してます。 見ると分かりますが、べたにStringBuilderにAppend、Appendしてます。 ストリングインターポレーションだとパフォーマンスに問題があるので、そこそこ大きなコード生成はこうする必要があります。 でも、これ面倒ですよね? ってことで、T4テンプレートの出番です。 こいつです。 さっきはプロパティのカスタムツールが、ほにゃららGeneratorになっていましたが 今度はほにゃららProcessorになってます。 こうすると、Append、Appendするコードをテンプレートから生成してくれます。 お前は神か!って感じですよね。 こいつは、配布されないので利用者が意識しなくてよいのでT4のデメリットが薄いです。 さてこいつの本当にすごいのは、デバッグすると ちゃんと生成されたコードもステップ実行できちゃうという点です。やばい。 また実行速度も PTTXへ
  39. 早いですね
  40. これらの理由からSource Generatorは、利用者に特別な理解を求める必要がなく、 再配布しやすいというのがT4比較時のメリットです。 なので、今後はDapperのようなライブラリでも型変換コードの生成を 動的に実行するのではなく、事前にソース生成しておいて利用する形が流行るかもしれません。 早いですからね。 また、Analyzerとの相性が良いので、ユーザーフレンドリーなライブラリを作りやすいのも特徴です。 VSへ 例えば、Identifier属性は1クラス一つと制限しましたが こうやって二つにすると、ちゃんとエラーを出してあげることができます。 PPTX 利用者からすると、使いやすいですよね。 またIDE非依存なのでCI/CDも簡単です。 良いです。
  41. 最後にFodyです。 これは曲者ですね VSへ こいつは、C#コードではなくて、ビルドされたあとにDLLを直接改変します。 つまりILをいじります。 ここのコメントの下のコードがILの記述ですが、まぁふつう読めないですよね。 でも実行速度は
  42. 早いです。 Source Generatorとかより遅いのは、計測誤差です。
  43. 他と比較した場合、Fodyは既存コードの改変が行えるのが最大の特徴です。 そのため、AOPしたい場合なんかで、Source Generatorなんかじゃ実現できなかったことができちゃうのが強みです。 例えば既存コードにトラッキングコードやリトライ実装を埋め込んだりなんかですね。 ただ逆にいうと、ほかの手段で代替できるものは、他の物を利用したほうが良いです。 まずILを覚えなきゃってことで、類似性のない新言語を1つ覚える必要がありますし 同じ実装するにしても、何倍もコードを書かないといけませんし、必要なテストコードも膨れ上がります。 これは、ソース生成であれば1パターンでいいのが、IL生成だと複数パターン実装しないといけないのがその理由です。 たとえば、メンバの値を取得するにしても、メンバを保持しているのが、クラスなのか、ストラクトなのか、Genericなのか メンバがフィールドなのかプロパティなのか、取得対象がクラスなのかストラクトなのか、それによって全部分岐が入るので 累乗的にやることが増えていきます。 多機能だけど、大変。それがFodyです。
  44. ということでまとめましょう。
  45. いま実はIComparableのボイラーコードを生成するSource Generatorのライブラリを作ってます。 できたら、良かったら使ってください!おしまい
  46. ではなくて
  47. .NETにはいろんなメタプログラミングの技法があります
  48. どれもそれぞれに強みがあって適材適所です 向いているものを向いている場所で使いましょう 特にILをいじるのは最終手段ですよ!
  49. ということで、今度こそおしまいです。 ご清聴ありがとうございました。