SlideShare a Scribd company logo
C# Design Note 
岩永信之
Roslyn 
• http://roslyn.codeplex.com/ 
• C#/VBコンパイラー再設計プロジェクト 
• 製品名は「.NET Compiler Platform」になりそう 
• いいこと 
• MSの中の人がVisual Studioを作りやすくなる 
• サードパーティ製VSプラグインが作りやすくなる 
• これが一番の急務 
• おまけで、C#言語新機能も足しやすく
今日の話題 
• 新機能がどうというより、開発体制の変化 
• これまで 
• 製品版の2年は前にはCTP提供 
• 動くコンパイラー提供 
• この時点で仕様書結構かっちり/全機能分 
• 今 
• Roslynプロジェクトのオープン化 
• 最新機能を試したかったらcloneして自分でビルド 
• 緩い段階で仕様公開&ディスカッション/個別に機能追加
Discussions 
• Discussions under C# Language Design† 
• C#の言語機能についてのディスカッションページ 
• 誰でも投稿可能 
† http://roslyn.codeplex.com/discussions/topics/5998/c-language-design
Design Notes 
• C# Language Design Notes† 
• C#チームのデザインミーティング議事録※ 
• C#新機能、案を採用するか否か、実装の方針、懸 
念点など 
† https://roslyn.codeplex.com/wikipage?title=CSharp%20Language%20Design%20Notes 
※ ディスカッションとして投稿してて、誰でもコメント付け可能
例えば、VS “14” CTP 3新機能 
• 7/9のAgenda† 
1. Detailed design of nameof <details settled> 
2. Design of #pragma warning extensions <allow identifiers> 
7/9のDesign Notesの内容が 
そのままCTP 3(8/18公開)で実装されてる 
† https://roslyn.codeplex.com/discussions/552377
nameof 
• メンバー名を文字列化 
• renameリファクタリングできるstringリテラル 
class Point(double x, double y) : BindableBase 
{ 
double _x = x; 
double _y = y; 
public double X 
{ 
get { return _x; } 
set 
{ 
SetProperty(ref _x, value); 
OnPropertyChanged(nameof(Length)); 
} 
} 
public double Y 
{ 
get { return _y; } 
set 
{ 
SetProperty(ref _y, value); 
OnPropertyChanged(nameof(Length)); 
} 
} 
public double Length => Math.Sqrt(X * X + Y * Y); 
} 
…前略… 
SetProperty(ref _y, value); 
OnPropertyChanged(nameof(Length)); 
} 
} 
メンバー名を文字列化 
public double Length => Math.Sqrt(X * X + Y * Y);
#pragma warning extensions 
• サードパーティ製診断ツールのwarning抑止 
• 今まで: 
コンパイラー正規の警告を 
警告番号を指定して抑止
#pragma warning extensions 
• サードパーティ製診断ツールのwarning抑止 
• 追加: 
(Roslynを使って作った)VS拡張による警告を 
識別子名を使って抑止
この辺りは即断即決 
• nameofも#pragma拡張も、割と手早く仕様が 
決まって、問題なく実装されてる類 
• 悩ましいものも 
• Design Notes 8/27: parameterless constructors 
• Design Notes 9/3: declaration expressions
Parameterless Constructors 
• Design Notes 8/27† 
• The meeting focused on rounding out the feature 
set around structs. 
1. Allowing parameterless constructors in structs <allow, 
but some unresolved details> 
2. Definite assignment for imported structs <revert to 
Dev12 behavior> 
† https://roslyn.codeplex.com/discussions/562559
背景: 既定値 
• 値型の既定値は0クリア 
var points = new Point[1000]; 
• Pointが構造体のとき、コンストラクターを1000回呼ぶのか 
• 呼びたくないので、memset(0)にしたい
背景: new T() 
• 現状、new T()で既定値を作る 
var p = new Point(); 0クリア 
• 構造体はパラメーターなしのコンストラクターを持 
てない
背景: default(T) 
• .NET 2.0以降には、既定値用のdefault(T)がある 
var p = default(Point); 0クリア 
var p = new Point(); これで0クリアする必要まだある? 
• ちなみに 
コンストラクター呼んでもよくない? 
• .NET IL仕様上は構造体がパラメーターなしのコンス 
トラクター持てる 
• C#のコンパイラーレベルでエラーにしてる
問題: genericsのnew T()制約 
• new T() == default(T) 前提の最適化 
T M<T>() 
where T : new() 
{ 
return new T(); 
} 
Tが構造体の時、0クリアに 
最適化してしまう 
• new T() がコンストラクターを呼ぶようにするには 
ここも仕様変更に
問題: 既定の引数 
• 既定の引数= 定数のみ指定できる 
void M(S s = new S()) 
{ 
} 
• 現仕様(new S() == default(S)) なら 
問題なく使える 
• 新仕様(new S()はコンストラクター 
呼び出し)だとダメ 
変更必要 
void M(S s = default(S)) 
{ 
}
問題: T(…) : this() 
• コンストラクターから引数なしのコンストラク 
ターを呼ぶ場合 
struct S 
{ 
S(int x) : this() { X = x; } 
int X { get; set; } 
} 
• 引数なしコンストラクターを定 
義してある場合、どうなる? 
• 0クリアだけにしたい場合どう 
する? 
別構文が必要かも 
S(int x) : default() { X = x; }
検討: フィールド初期化子 
• 引数なしコンストラクターに伴って、 
構造体でもフィールド初期化子が使えるように 
struct S 
{ 
string label = "<unknown>"; 
bool pending = true; 
} 
構造体でもこういう 
書き方が可能に
検討: フィールド初期化子 
• 引数なしコンストラクターに伴って、 
構造体でもフィールド初期化子が使えるように 
ただし… 
• クラスに合わせて引数なしコンストラクターを自動 
生成する? 
• 今の構造体の仕様への追加になるように、引数なし 
のコンストラクターを明示的に書かないと初期化子 
動かなくする? 
• プライマリーコンストラクターがあるときはどう 
する?
Declaration Expressions 
• Design Notes 9/3† 
• The meeting focused on rounding out the design of 
declaration expressions 
1. Removing “spill out” from declaration expressions in 
simple statements <yes, remove> 
2. Same name declared in subsequent else-if’s <condition 
decls out of scope in else-branch> 
3. Add semicolon expressions <not in this version> 
4. Make variables in declaration expressions readonly 
<no> 
† http://roslyn.codeplex.com/discussions/565640
背景 
• declaration expressions自体はCTP 2で入ってる 
• 式の途中で変数宣言 
var n = int.TryParse(s, out var x) ? x : 0; 
if ((var x = obj as C) != null) { } 
else { } 
var y = (var x = GetValue()) * x; 
p.GetCoordinates(out var x, out var y); 
• 問題は、この変数xのスコープがどこまで続くか
検討: 宣言した変数のスコープ 
• 現仕様 
• 宣言後、ブロックの終わりまで 
{ 
var p = new Point(); 
p.GetCoordinates(out var x, out var y); 
var p = x * y; // OK 
Console.WriteLine("{0} = {1} × {2}", p, x, y); 
} 
// ここから先、x, y 使えない 
• 検討事項 
• ステートメント内に限るべきではないか 
• if-elseの場合、else句ではどうするか
検討: ステートメント内に限る 
• ほんとうにステートメントの外で使う? 
ステートメント内 
var n = int.TryParse(s, out var x) ? x : 0; 
var y = (var x = GetValue()) * x; 
p.GetCoordinates(out var x, out var y); 
var p = x * y; 
Console.WriteLine("{0} = {1} × {2}", p, x, y); 
xを使いたい範囲 
ステートメント内 
こいつ、要る? 
• C#だと、多値戻り値自体あまり推奨されてない 
• = 利用場面少ない 
• =レアケースのためにxのスコープ広げる? 
• ステートメント内に限った方がよくない?
検討: if-else 
• else句で使いたい? 
• →使いたい方がレアケース 
else句で意味ある値持ってない 
if (int.TryParse(s, out var x)) { } 
if ((var x = obj as A) != null) { } 
else if ((var x = obj as B) != null) { } 
else { } 
else句にスコープが漏れると 
むしろ使いにくい
検討: if-else 
• else句で使いたい? 
• else句に変数が残らないようにした場合の問題 
• if-elseで1つのステートメント 
→ 「変数のスコープはステートメント内で完結」ってシンプ 
ルなルールじゃなくなる(それより短い) 
• if (b) S1 else S2 
と 
if (!b) S2 else S1 
で意味が変わる
Pattern Matching 
• Draft spec for records and pattern-matching in 
C#† 
• C#にも型のパターンマッチングが入りそう 
• 現在はdraft 
• 実装もあり(まだmasterブランチには入ってない) 
† http://roslyn.codeplex.com/discussions/560339
パターンマッチング式 
• isを拡張 
if (exp is Add(Expression left, Expression right) { … } 
• switchも拡張 
switch (exp) 
{ 
case Add(Const(0), var x): return x; 
case Mul(Const(0), var x): return Const(0); 
}
operator is 
• 型判定+is演算子に展開 
static bool operator is(Cartesian c, out double x, out double y) 
{ 
x = c.X; 
y = c.Y; 
return true; 
}
record型 
• is, Equals, GetHashCode, ToStringの自動生成 
• プライマリコンストラクターの引数から 
プロパティを自動生成 
record class Point(int X, int Y) { } 
class Point(int x, int y) 
{ 
public int X { get; } = x; 
public int Y { get; } = y; 
public static bool operator is(…) { … } 
override public bool Equals(object obj) { … } 
override public int GetHashCode() { … } 
override public string ToString() { … } 
}
まとめ 
• http://roslyn.codeplex.com/ 
• 開発体制の変化: オープン化 
• 最新機能を試したかったらcloneして自分でビルド 
• 緩い段階で仕様公開&ディスカッション/個別に機 
能追加 
• 最近のディスカッション・仕様追加 
• 構造体の引数なしコンストラクター 
• 宣言式の変数スコープ 
• 型パターンマッチング

More Related Content

What's hot

.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
信之 岩永
 
広がる .Net
広がる .Net広がる .Net
広がる .Net
信之 岩永
 
dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2
Yusuke Fujiwara
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方
信之 岩永
 
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
信之 岩永
 
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジーHub DotnetDeveloper
 
Orange Cube 自社フレームワーク 2015/3
Orange Cube 自社フレームワーク 2015/3Orange Cube 自社フレームワーク 2015/3
Orange Cube 自社フレームワーク 2015/3
信之 岩永
 
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
信之 岩永
 
.NET Core とマルチプラットフォーム
.NET Core とマルチプラットフォーム.NET Core とマルチプラットフォーム
.NET Core とマルチプラットフォーム
shozon
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Teppei Sato
 
Bluetoothでgo!
Bluetoothでgo!Bluetoothでgo!
Bluetoothでgo!
Kouji Matsui
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
terurou
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode Contracts
Yoshifumi Kawai
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
Kouji Matsui
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
信之 岩永
 
今からでも遅くないC#開発
今からでも遅くないC#開発今からでも遅くないC#開発
今からでも遅くないC#開発
Kazunori Hamamoto
 
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
UnityTechnologiesJapan002
 

What's hot (20)

.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
広がる .Net
広がる .Net広がる .Net
広がる .Net
 
dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方
 
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
 
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
 
Orange Cube 自社フレームワーク 2015/3
Orange Cube 自社フレームワーク 2015/3Orange Cube 自社フレームワーク 2015/3
Orange Cube 自社フレームワーク 2015/3
 
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
 
.NET Core とマルチプラットフォーム
.NET Core とマルチプラットフォーム.NET Core とマルチプラットフォーム
.NET Core とマルチプラットフォーム
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
 
Bluetoothでgo!
Bluetoothでgo!Bluetoothでgo!
Bluetoothでgo!
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode Contracts
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
今からでも遅くないC#開発
今からでも遅くないC#開発今からでも遅くないC#開発
今からでも遅くないC#開発
 
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
 

Viewers also liked

Code Contracts in .NET 4
Code Contracts in .NET 4Code Contracts in .NET 4
Code Contracts in .NET 4信之 岩永
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
信之 岩永
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
信之 岩永
 
Anders Hejlsberg Q & A
Anders Hejlsberg Q & AAnders Hejlsberg Q & A
Anders Hejlsberg Q & A
信之 岩永
 
Coding Interview
Coding InterviewCoding Interview
Coding Interview
信之 岩永
 
Interaction channel
Interaction channelInteraction channel
Interaction channel
信之 岩永
 
C#への招待
C#への招待C#への招待
C#への招待
Yusuke Matsushita
 
SFC Design theory 2012 6/13
SFC Design theory 2012 6/13SFC Design theory 2012 6/13
SFC Design theory 2012 6/13
Mitsuru Muramatsu
 
Keep yourself up to date
Keep yourself up to dateKeep yourself up to date
Keep yourself up to date
信之 岩永
 
2013年 Webデザインのトレンドを振り返る
2013年 Webデザインのトレンドを振り返る2013年 Webデザインのトレンドを振り返る
2013年 Webデザインのトレンドを振り返る
hiroki-ishikawa
 
それっぽく、適当に
それっぽく、適当にそれっぽく、適当に
それっぽく、適当に
信之 岩永
 
Interactive UI with UniRx
Interactive UI with UniRxInteractive UI with UniRx
Interactive UI with UniRx
Yuto Iwashita
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
信之 岩永
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
 
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
Toru Nayuki
 
若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発
Hirohito Morinaga
 
The History of Reactive Extensions
The History of Reactive ExtensionsThe History of Reactive Extensions
The History of Reactive Extensions
Yoshifumi Kawai
 
UniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for UnityUniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for Unity
Yoshifumi Kawai
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
Yoshifumi Kawai
 
レスポンシブサイト制作に効く デザインTipsあれこれ
レスポンシブサイト制作に効く デザインTipsあれこれレスポンシブサイト制作に効く デザインTipsあれこれ
レスポンシブサイト制作に効く デザインTipsあれこれ
Akiko Kurono
 

Viewers also liked (20)

Code Contracts in .NET 4
Code Contracts in .NET 4Code Contracts in .NET 4
Code Contracts in .NET 4
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
Anders Hejlsberg Q & A
Anders Hejlsberg Q & AAnders Hejlsberg Q & A
Anders Hejlsberg Q & A
 
Coding Interview
Coding InterviewCoding Interview
Coding Interview
 
Interaction channel
Interaction channelInteraction channel
Interaction channel
 
C#への招待
C#への招待C#への招待
C#への招待
 
SFC Design theory 2012 6/13
SFC Design theory 2012 6/13SFC Design theory 2012 6/13
SFC Design theory 2012 6/13
 
Keep yourself up to date
Keep yourself up to dateKeep yourself up to date
Keep yourself up to date
 
2013年 Webデザインのトレンドを振り返る
2013年 Webデザインのトレンドを振り返る2013年 Webデザインのトレンドを振り返る
2013年 Webデザインのトレンドを振り返る
 
それっぽく、適当に
それっぽく、適当にそれっぽく、適当に
それっぽく、適当に
 
Interactive UI with UniRx
Interactive UI with UniRxInteractive UI with UniRx
Interactive UI with UniRx
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
 
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
 
若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発
 
The History of Reactive Extensions
The History of Reactive ExtensionsThe History of Reactive Extensions
The History of Reactive Extensions
 
UniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for UnityUniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for Unity
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
レスポンシブサイト制作に効く デザインTipsあれこれ
レスポンシブサイト制作に効く デザインTipsあれこれレスポンシブサイト制作に効く デザインTipsあれこれ
レスポンシブサイト制作に効く デザインTipsあれこれ
 

Similar to C# design note sep 2014

2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ
kumake
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
 
Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要
Yoshihisa Ozaki
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティング
Kazuki Takai
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
Akira Takahashi
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Ryo Nakamaru
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
 
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
keki3
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
道化師 堂華
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
 
とあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)IIとあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)II
Kazuhiro Yoshikawa
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
Kiyoshi Ogawa
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 

Similar to C# design note sep 2014 (20)

2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティング
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
C++の復習
C++の復習C++の復習
C++の復習
 
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
とあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)IIとあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)II
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
 
Scrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
130207 kyotorb
130207 kyotorb130207 kyotorb
130207 kyotorb
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 

More from 信之 岩永

YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話
信之 岩永
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
信之 岩永
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理
信之 岩永
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
信之 岩永
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
信之 岩永
 
プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版
信之 岩永
 
C#マスコット(公開用)
C#マスコット(公開用)C#マスコット(公開用)
C#マスコット(公開用)
信之 岩永
 

More from 信之 岩永 (8)

YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版
 
C#マスコット(公開用)
C#マスコット(公開用)C#マスコット(公開用)
C#マスコット(公開用)
 

Recently uploaded

TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 

Recently uploaded (14)

TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 

C# design note sep 2014

  • 1. C# Design Note 岩永信之
  • 2. Roslyn • http://roslyn.codeplex.com/ • C#/VBコンパイラー再設計プロジェクト • 製品名は「.NET Compiler Platform」になりそう • いいこと • MSの中の人がVisual Studioを作りやすくなる • サードパーティ製VSプラグインが作りやすくなる • これが一番の急務 • おまけで、C#言語新機能も足しやすく
  • 3. 今日の話題 • 新機能がどうというより、開発体制の変化 • これまで • 製品版の2年は前にはCTP提供 • 動くコンパイラー提供 • この時点で仕様書結構かっちり/全機能分 • 今 • Roslynプロジェクトのオープン化 • 最新機能を試したかったらcloneして自分でビルド • 緩い段階で仕様公開&ディスカッション/個別に機能追加
  • 4. Discussions • Discussions under C# Language Design† • C#の言語機能についてのディスカッションページ • 誰でも投稿可能 † http://roslyn.codeplex.com/discussions/topics/5998/c-language-design
  • 5. Design Notes • C# Language Design Notes† • C#チームのデザインミーティング議事録※ • C#新機能、案を採用するか否か、実装の方針、懸 念点など † https://roslyn.codeplex.com/wikipage?title=CSharp%20Language%20Design%20Notes ※ ディスカッションとして投稿してて、誰でもコメント付け可能
  • 6. 例えば、VS “14” CTP 3新機能 • 7/9のAgenda† 1. Detailed design of nameof <details settled> 2. Design of #pragma warning extensions <allow identifiers> 7/9のDesign Notesの内容が そのままCTP 3(8/18公開)で実装されてる † https://roslyn.codeplex.com/discussions/552377
  • 7. nameof • メンバー名を文字列化 • renameリファクタリングできるstringリテラル class Point(double x, double y) : BindableBase { double _x = x; double _y = y; public double X { get { return _x; } set { SetProperty(ref _x, value); OnPropertyChanged(nameof(Length)); } } public double Y { get { return _y; } set { SetProperty(ref _y, value); OnPropertyChanged(nameof(Length)); } } public double Length => Math.Sqrt(X * X + Y * Y); } …前略… SetProperty(ref _y, value); OnPropertyChanged(nameof(Length)); } } メンバー名を文字列化 public double Length => Math.Sqrt(X * X + Y * Y);
  • 8. #pragma warning extensions • サードパーティ製診断ツールのwarning抑止 • 今まで: コンパイラー正規の警告を 警告番号を指定して抑止
  • 9. #pragma warning extensions • サードパーティ製診断ツールのwarning抑止 • 追加: (Roslynを使って作った)VS拡張による警告を 識別子名を使って抑止
  • 10. この辺りは即断即決 • nameofも#pragma拡張も、割と手早く仕様が 決まって、問題なく実装されてる類 • 悩ましいものも • Design Notes 8/27: parameterless constructors • Design Notes 9/3: declaration expressions
  • 11. Parameterless Constructors • Design Notes 8/27† • The meeting focused on rounding out the feature set around structs. 1. Allowing parameterless constructors in structs <allow, but some unresolved details> 2. Definite assignment for imported structs <revert to Dev12 behavior> † https://roslyn.codeplex.com/discussions/562559
  • 12. 背景: 既定値 • 値型の既定値は0クリア var points = new Point[1000]; • Pointが構造体のとき、コンストラクターを1000回呼ぶのか • 呼びたくないので、memset(0)にしたい
  • 13. 背景: new T() • 現状、new T()で既定値を作る var p = new Point(); 0クリア • 構造体はパラメーターなしのコンストラクターを持 てない
  • 14. 背景: default(T) • .NET 2.0以降には、既定値用のdefault(T)がある var p = default(Point); 0クリア var p = new Point(); これで0クリアする必要まだある? • ちなみに コンストラクター呼んでもよくない? • .NET IL仕様上は構造体がパラメーターなしのコンス トラクター持てる • C#のコンパイラーレベルでエラーにしてる
  • 15. 問題: genericsのnew T()制約 • new T() == default(T) 前提の最適化 T M<T>() where T : new() { return new T(); } Tが構造体の時、0クリアに 最適化してしまう • new T() がコンストラクターを呼ぶようにするには ここも仕様変更に
  • 16. 問題: 既定の引数 • 既定の引数= 定数のみ指定できる void M(S s = new S()) { } • 現仕様(new S() == default(S)) なら 問題なく使える • 新仕様(new S()はコンストラクター 呼び出し)だとダメ 変更必要 void M(S s = default(S)) { }
  • 17. 問題: T(…) : this() • コンストラクターから引数なしのコンストラク ターを呼ぶ場合 struct S { S(int x) : this() { X = x; } int X { get; set; } } • 引数なしコンストラクターを定 義してある場合、どうなる? • 0クリアだけにしたい場合どう する? 別構文が必要かも S(int x) : default() { X = x; }
  • 18. 検討: フィールド初期化子 • 引数なしコンストラクターに伴って、 構造体でもフィールド初期化子が使えるように struct S { string label = "<unknown>"; bool pending = true; } 構造体でもこういう 書き方が可能に
  • 19. 検討: フィールド初期化子 • 引数なしコンストラクターに伴って、 構造体でもフィールド初期化子が使えるように ただし… • クラスに合わせて引数なしコンストラクターを自動 生成する? • 今の構造体の仕様への追加になるように、引数なし のコンストラクターを明示的に書かないと初期化子 動かなくする? • プライマリーコンストラクターがあるときはどう する?
  • 20. Declaration Expressions • Design Notes 9/3† • The meeting focused on rounding out the design of declaration expressions 1. Removing “spill out” from declaration expressions in simple statements <yes, remove> 2. Same name declared in subsequent else-if’s <condition decls out of scope in else-branch> 3. Add semicolon expressions <not in this version> 4. Make variables in declaration expressions readonly <no> † http://roslyn.codeplex.com/discussions/565640
  • 21. 背景 • declaration expressions自体はCTP 2で入ってる • 式の途中で変数宣言 var n = int.TryParse(s, out var x) ? x : 0; if ((var x = obj as C) != null) { } else { } var y = (var x = GetValue()) * x; p.GetCoordinates(out var x, out var y); • 問題は、この変数xのスコープがどこまで続くか
  • 22. 検討: 宣言した変数のスコープ • 現仕様 • 宣言後、ブロックの終わりまで { var p = new Point(); p.GetCoordinates(out var x, out var y); var p = x * y; // OK Console.WriteLine("{0} = {1} × {2}", p, x, y); } // ここから先、x, y 使えない • 検討事項 • ステートメント内に限るべきではないか • if-elseの場合、else句ではどうするか
  • 23. 検討: ステートメント内に限る • ほんとうにステートメントの外で使う? ステートメント内 var n = int.TryParse(s, out var x) ? x : 0; var y = (var x = GetValue()) * x; p.GetCoordinates(out var x, out var y); var p = x * y; Console.WriteLine("{0} = {1} × {2}", p, x, y); xを使いたい範囲 ステートメント内 こいつ、要る? • C#だと、多値戻り値自体あまり推奨されてない • = 利用場面少ない • =レアケースのためにxのスコープ広げる? • ステートメント内に限った方がよくない?
  • 24. 検討: if-else • else句で使いたい? • →使いたい方がレアケース else句で意味ある値持ってない if (int.TryParse(s, out var x)) { } if ((var x = obj as A) != null) { } else if ((var x = obj as B) != null) { } else { } else句にスコープが漏れると むしろ使いにくい
  • 25. 検討: if-else • else句で使いたい? • else句に変数が残らないようにした場合の問題 • if-elseで1つのステートメント → 「変数のスコープはステートメント内で完結」ってシンプ ルなルールじゃなくなる(それより短い) • if (b) S1 else S2 と if (!b) S2 else S1 で意味が変わる
  • 26. Pattern Matching • Draft spec for records and pattern-matching in C#† • C#にも型のパターンマッチングが入りそう • 現在はdraft • 実装もあり(まだmasterブランチには入ってない) † http://roslyn.codeplex.com/discussions/560339
  • 27. パターンマッチング式 • isを拡張 if (exp is Add(Expression left, Expression right) { … } • switchも拡張 switch (exp) { case Add(Const(0), var x): return x; case Mul(Const(0), var x): return Const(0); }
  • 28. operator is • 型判定+is演算子に展開 static bool operator is(Cartesian c, out double x, out double y) { x = c.X; y = c.Y; return true; }
  • 29. record型 • is, Equals, GetHashCode, ToStringの自動生成 • プライマリコンストラクターの引数から プロパティを自動生成 record class Point(int X, int Y) { } class Point(int x, int y) { public int X { get; } = x; public int Y { get; } = y; public static bool operator is(…) { … } override public bool Equals(object obj) { … } override public int GetHashCode() { … } override public string ToString() { … } }
  • 30. まとめ • http://roslyn.codeplex.com/ • 開発体制の変化: オープン化 • 最新機能を試したかったらcloneして自分でビルド • 緩い段階で仕様公開&ディスカッション/個別に機 能追加 • 最近のディスカッション・仕様追加 • 構造体の引数なしコンストラクター • 宣言式の変数スコープ • 型パターンマッチング

Editor's Notes

  1. これとか、仕様書(案)見てても載ってないけど、実際にVS “14” CTP 3で試してみたらちゃんと動いた。