SlideShare una empresa de Scribd logo
1 de 33
契約プログラミング
++C++;
岩永 信之
Design by Contract
 Effel言語が最初に導入して…
 1985年
 Bertrand Meyerによって作られる
 実はEffel Software社の商標らしい
 ので、Contract Programmingとか別呼称が流行る
で、Contract(契約)って何?
契約って何?
フォーマルな仕様
契約
 契約=形式的、詳細、検証可能な仕様
仕様は可能な限りツールを使って
機械的な検証ができた方がいい
• 仕様は誰が何に使うもの?
• 何なら機械的な検証が可能?
仕様は誰がどう使う?
• クラスやメソッドの利用者が使う
ドキュメント
• 静的チェッカー(ビルド ツール)が使う
型情報
• 動的チェッカー(テスト ツール)が使う
テスト記述
ここでいうドキュメント
 上流工程的なのでなくて
1cm/○○万円
ここでいうドキュメント
 クラスやメソッドの利用者が見るやつ
 つまり、↓これ
書き方に迷った時に見る:
• リファレンス ドキュメント
• サンプル コード
• 等々
ドキュメント
 理想: 実行可能なコード自体がドキュメントであるべき
 クラス名、メソッド名、シグネチャ、すべてがドキュメント
 コードで表現できないことを、やむなく自然言語で補足
コードの表現力が上がれば、補足は減る
契約 = コードの表現力向上
検証可能な仕様
 型情報
 メソッドの名前やシグネチャも仕様の一種
static void Main(string[] args)
{
var y = F(10);
}
static int F(int x)
{
return x * x;
}
• Fというメソッドがなければエラー
• int以外を渡すとエラー
静的な型付けの言語では
静的に検証可能
型情報に表れない仕様
 型情報に表れない仕様はどう書く?
 Docコメント?
/// <summary>
/// なんか変換する。
/// </summary>
/// <param name="s">変換元。null であってはいけない。</param>
/// <returns>変換結果。</returns>
public static string Convert(string s)
• で、誰が保証するの?
• 違反するとどうなるの?
検証用コード
 普通、引数チェック入れるよね
 DRY原則に反してる!
/// <summary>
/// なんか変換する。
/// </summary>
/// <param name="s">変換元。null であってはいけない。</param>
/// <returns>変換結果。</returns>
public static string Convert(string s)
{
if (s == null) throw new ArgumentNullException("s");
同じ意味のことを2か所に書いてる
コードの方だけでいい?
 じゃあ、Docコメントの方消してみると…
 例外発生してみて初めて利用者に見える
利用者に見えなくなる
/// <summary>
/// なんか変換する。
/// </summary>
/// <param name="s">変換元。</param>
/// <returns>変換結果。</returns>
public static string Convert(string s)
{
if (s == null) throw new ArgumentNullException("s");
そこで、契約
 ↓これと同じような意味になる何かが必要
/// <param name="s">変換元。null であってはいけない。</param>
/// <returns>変換結果。</returns>
public static string Convert(string s)
{
if (s == null) throw new ArgumentNullException("s");
検証コード
利用者から見える情報
契約 = 検証可能な仕様
さて、じゃあ、どう書こう
 契約用の新文法が欲しいところだけども
 例えば・・・Spec#ではこう書く
public static string Convert(string s)
requires s != null;
ensures result != null;
{
…
}
これは、じゃあ、どうコンパイルされるべき?
.NETの場合、複数の言語での情報共有が必須
Spec# = C# + 契約
どうコンパイルされるべき?
 属性は・・・
 与えれる引数が組み込み型に限られる
 → 複雑な条件を書けない
 ILの仕様を変更する?
 サード パーティ製含め、全てのコンパイラーに変更を強要する?
 Code Contracts
 普通の検証コード + IL書き換え
Code Contracts
 契約を、普通にコードとして書く
 そして、
 コードから契約を読み取って静的解析
 ビルド時IL書き換えでテスト用の検証コードを埋め込み
 ちゃんとXMLドキュメントに反映
public static string Convert(string s)
{
Contract.Requires(s != null);
Contract.Ensures(Contract.Result<string>() != null);
…
}
IL書き換え
 動的チェックする場合にはIL書き換え
Contract.Requires(s != null);
Contract.Ensures(Contract.Result<string>() != nul
l);
return s.ToUpper();
Debug.Assert(s != null, "s != null");
var t = s.ToUpper();
Debug.Assert(t != null,
"Contract.Result<string>() != null");
return t
☑
最初からAssertでよくない?
 メタデータにならない
 Requires/Ensuresとかの情報が消える
Debug.Assert(s != null, "s != null");
var t = s.ToUpper();
Debug.Assert(t != null, "Contract.Result<string>() != null");
return t
エラーにすべき理由がわからない
静的チェック時に困る
契約と証明
契約が守られているか、静的に解析
契約として表明する条件
 事前条件(precondition)
 Contract.Requires(条件)
 事後条件(postcondition)
 Contract.Ensures(条件)
 不変条件(invariant)
 Contract.Invariant(条件)
事前条件
 メソッドに入る瞬間に満たすべき条件
public static string Convert(string s)
{
Contract.Requires(s != null);
…
string s = null;
var t = Convert(s);
ダメ!絶対!
事後条件
 メソッドを出る瞬間に満たすべき条件
public static string Convert(string s)
{
Contract.Ensures(Contract.Result<string>() != null);
…
var t = Convert(s);
if (t != null) …
チェックしなくても非null保証あり
不変条件
 常に変わらない条件
public int X { get; set; }
public int Y { get; set; }
[ContractInvariantMethod]
void CheckInvariant()
{
Contract.Invariant(X + Y == 0);
}
証明
 証明(prove)
 契約が満たされているか静的に検証
// 事後条件: null は返さないよ。
public static string GetString() { … }
// 事前条件: s は null を認めないよ。
public static string Convert(string s) { … }
var s = GetString();
var t = Convert(s);
nullは返ってこない
nullは渡らない
間にnullチェック不要
制御フローも見つつ証明
 コード全体を解析
if (s != null)
{
var t = Convert(s);
} nullは渡らない
条件分岐してるんだから
契約はあくまで自己申告
 全てのメソッドが正しく契約を表明しているとは限らない
// 契約に未対応。
public static string GetString() { … }
// 事前条件: s は null を認めないよ。
public static string Convert(string s) { … }
var s = GetString();
var t = Convert(s);
証明不能
var s = GetString();
Contract.Assume(s != null);
var t = Convert(s);
しょうがないから
「仮定」を入れる
動的なテストで確認
暗黙的な検証条件
 もちろん、逆に、明示的な表明しなくてもコードから推定でき
る条件も
 メンバー呼んでたらnon-null
 x/y してたら y != 0
 配列の境界チェック
コード書き換え
 IL書き換え?
 基本、全部[Conditional]付きで、そのままだと実行されな
いpublic static object GetData(int i)
{
Contract.Requires(i > 0);
Contract.Ensures(Contract.Result<object>() != null);
…
}
だって、戻り値に対する事後条件とか、メソッ
ド中でチェックできるわけじゃないじゃない。
 Requiresとかの中に掛けるメソッドは[Pure]でないと
 Pure=副作用がない
 [Pure]属性はあくまで自己申告なのだけども・・・
public int X { get; set; }
public int Y { get; set; }
[ContractInvariantMethod]
void CheckInvariant()
{
Contract.Invariant(Norm == 0);
}
[Pure]
public int Norm { get { return X + Y; } }
問題点
 契約の表明はあくまで自己申告
 ウソつける(部分もある)
 契約表明してないメソッドが1個でもあると・・・
 それ使うたびにチェック コード挿入しないといけなくなる
 静的検証すごく重い
 C#の普通の文法チェックみたいに、リアルタイム チェック無理
あと、IL書き換えとか、どうなんだろうね
まとめ: 契約とは
 契約=形式的仕様
 利用者に見えるべき
 可能な限り静的チェックすべき
 静的チェックに漏れる分は動的チェックする
 つまり
 契約はドキュメントに含まれるべき
 契約は静的チェックの対象(型情報の一部)であるべき
 契約は動的チェックの対象(テスト仕様)であるべき
まとめ: Code Contracts
 普通にコードで契約を書く
 静的チェックしてくれる
 IL書き換えで動的チェック
 ドキュメントにも反映

Más contenido relacionado

La actualidad más candente

非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかYoshifumi Kawai
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術dena_study
 
Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみたPython製BDDツールで自動化してみた
Python製BDDツールで自動化してみたKeijiUehata1
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?Yoshitaka Kawashima
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionYoshifumi Kawai
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~torisoup
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
契約プログラミング
契約プログラミング契約プログラミング
契約プログラミングOda Shinsuke
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonadKouji Matsui
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャota42y
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?京大 マイコンクラブ
 

La actualidad más candente (20)

非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみたPython製BDDツールで自動化してみた
Python製BDDツールで自動化してみた
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
契約プログラミング
契約プログラミング契約プログラミング
契約プログラミング
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 

Destacado

今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
それっぽく、適当に
それっぽく、適当にそれっぽく、適当に
それっぽく、適当に信之 岩永
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you信之 岩永
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014信之 岩永
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform信之 岩永
 
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?Yasuhiko Yamamoto
 
C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版信之 岩永
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること信之 岩永
 
Code Contracts の紹介
Code Contracts の紹介Code Contracts の紹介
Code Contracts の紹介ゆぽ
 
Rust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみた
Rust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみたRust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみた
Rust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみたsumito3478
 
受託でもデキるアジャイル開発
受託でもデキるアジャイル開発受託でもデキるアジャイル開発
受託でもデキるアジャイル開発Yoshiyuki Ueda
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
Rust v1.0 release celebration party
Rust v1.0 release celebration partyRust v1.0 release celebration party
Rust v1.0 release celebration partyAkira Hayakawa
 

Destacado (20)

Deep Dive C# 6.0
Deep Dive C# 6.0Deep Dive C# 6.0
Deep Dive C# 6.0
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
それっぽく、適当に
それっぽく、適当にそれっぽく、適当に
それっぽく、適当に
 
.NET vNext
.NET vNext.NET vNext
.NET vNext
 
Modern .NET
Modern .NETModern .NET
Modern .NET
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you
 
Interaction channel
Interaction channelInteraction channel
Interaction channel
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
 
C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
Code Contracts の紹介
Code Contracts の紹介Code Contracts の紹介
Code Contracts の紹介
 
新しい契約形態での受託開発サービス
新しい契約形態での受託開発サービス新しい契約形態での受託開発サービス
新しい契約形態での受託開発サービス
 
Rust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみた
Rust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみたRust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみた
Rust 1.0 Release記念祝賀 - Rustのドキュメントを少し訳してみた
 
受託でもデキるアジャイル開発
受託でもデキるアジャイル開発受託でもデキるアジャイル開発
受託でもデキるアジャイル開発
 
C#への招待
C#への招待C#への招待
C#への招待
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
Rust v1.0 release celebration party
Rust v1.0 release celebration partyRust v1.0 release celebration party
Rust v1.0 release celebration party
 

Más de 信之 岩永

YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話信之 岩永
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話信之 岩永
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理信之 岩永
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム信之 岩永
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 
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)信之 岩永
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6信之 岩永
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版信之 岩永
 
Anders Hejlsberg Q & A
Anders Hejlsberg Q & AAnders Hejlsberg Q & A
Anders Hejlsberg Q & A信之 岩永
 
C#マスコット(公開用)
C#マスコット(公開用)C#マスコット(公開用)
C#マスコット(公開用)信之 岩永
 

Más de 信之 岩永 (17)

YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
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)
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6
 
Coding Interview
Coding InterviewCoding Interview
Coding Interview
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版
 
Anders Hejlsberg Q & A
Anders Hejlsberg Q & AAnders Hejlsberg Q & A
Anders Hejlsberg Q & A
 
C#マスコット(公開用)
C#マスコット(公開用)C#マスコット(公開用)
C#マスコット(公開用)
 
広がる .Net
広がる .Net広がる .Net
広がる .Net
 

Último

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 

Último (11)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

Code Contracts in .NET 4