SlideShare une entreprise Scribd logo
1  sur  30
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して自分でビルド 
• 緩い段階で仕様公開&ディスカッション/個別に機 
能追加 
• 最近のディスカッション・仕様追加 
• 構造体の引数なしコンストラクター 
• 宣言式の変数スコープ 
• 型パターンマッチング

Contenu connexe

Tendances

.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2Yusuke 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 高速化 TipsTakaaki 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
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集terurou
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode ContractsYoshifumi 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
 

Tendances (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による高速な通信の実装例~
 

En vedette

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信之 岩永
 
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 UniRxYuto 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 ExtensionsYoshifumi Kawai
 
UniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for UnityUniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for UnityYoshifumi 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
 

En vedette (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あれこれ
 

Similaire à 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
 
Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Yoshihisa Ozaki
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
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女子が狂える本当に気持ちのいい constexprGenya Murakami
 
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能keki3
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 
とあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)IIとあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)IIKazuhiro 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
 

Similaire à 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フレームワーク入門
 

Plus de 信之 岩永

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#マスコット(公開用)信之 岩永
 

Plus de 信之 岩永 (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#マスコット(公開用)
 

Dernier

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
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
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
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.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
論文紹介: 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
 
論文紹介: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
 

Dernier (11)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
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...
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
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の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: 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
 
論文紹介: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
 

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して自分でビルド • 緩い段階で仕様公開&ディスカッション/個別に機 能追加 • 最近のディスカッション・仕様追加 • 構造体の引数なしコンストラクター • 宣言式の変数スコープ • 型パターンマッチング

Notes de l'éditeur

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