Movatterモバイル変換


[0]ホーム

URL:


信之 岩永, profile picture
Uploaded by信之 岩永
PPTX, PDF12,841 views

C# design note sep 2014

2014/9/29 codeseek & C#UG にて

Embed presentation

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

Recommended

PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PPTX
Net fringejp2016
PPTX
C# 8.0 非同期ストリーム
PPTX
C#/.NETがやっていること 第二版
PPTX
Deep Dive C# 6.0
PPTX
Modern .NET
PPTX
.NET vNext
PPTX
C# 7.2 with .NET Core 2.1
PPTX
C#や.NET Frameworkがやっていること
PPTX
C#言語機能の作り方
PDF
今日からできる!簡単 .NET 高速化 Tips
PPTX
Unityで使える C# 6.0~と .NET 4.6
PDF
基礎からのCode Contracts
PPTX
.NET Core とマルチプラットフォーム
 
PPTX
広がる .Net
PDF
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
PPTX
Orange Cube 自社フレームワーク 2015/3
PDF
動的なILの生成と編集
PPTX
C#の書き方
PDF
Bluetoothでgo!
PDF
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
PPTX
.NET Core 2.x 時代の C#
PDF
今からでも遅くないC#開発
PPTX
2014 03-15 業務アプリinsider ソフトウェア方面の先進テクノロジー
PDF
.NET Coreから概観する.NETのOSSへの取り組み
PPTX
dotnetconfJP2017_netcore2
PPTX
.NET Compiler Platform
PPTX
今から始める、Windows 10&新.NETへの移行戦略

More Related Content

PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PPTX
Net fringejp2016
PPTX
C# 8.0 非同期ストリーム
PPTX
C#/.NETがやっていること 第二版
PPTX
Deep Dive C# 6.0
PPTX
Modern .NET
PPTX
.NET vNext
C# 8.0 Preview in Visual Studio 2019 (16.0)
今から始める、Windows 10&新.NETへの移行戦略
Net fringejp2016
C# 8.0 非同期ストリーム
C#/.NETがやっていること 第二版
Deep Dive C# 6.0
Modern .NET
.NET vNext

What's hot

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

Viewers also liked

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

Similar to C# design note sep 2014

PPTX
C# 9.0 / .NET 5.0
PPTX
C# 8
PDF
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
C# コーディングガイドライン 2013/02/26
PDF
C#勉強会 ~ C#9の新機能 ~
PDF
C#coding guideline その2_20130325
PPTX
C# 8.0 null許容参照型
PPTX
メタな感じのプログラミング(プロ生 + わんくま 071118)
PPTX
(ゲームじゃない方の)switchで遊びたい話
PPTX
Live Coding で学ぶ C# 7
PPTX
関数型言語&形式的手法セミナー(3)
PDF
プログラミングNet framework3のお題
PPTX
.NET Core 3.0 で使える C# 8
PDF
Unity2015_No10_~UGUI&Audio~
 
PPTX
C# 7・8 の復習
PDF
20141129-dotNet2015
PPTX
Visual basic14 の話
PPTX
C#6.0の新機能紹介
PPTX
C# 7 Current Status
C# 9.0 / .NET 5.0
C# 8
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
【Unite Tokyo 2019】Understanding C# Struct All Things
C# コーディングガイドライン 2013/02/26
C#勉強会 ~ C#9の新機能 ~
C#coding guideline その2_20130325
C# 8.0 null許容参照型
メタな感じのプログラミング(プロ生 + わんくま 071118)
(ゲームじゃない方の)switchで遊びたい話
Live Coding で学ぶ C# 7
関数型言語&形式的手法セミナー(3)
プログラミングNet framework3のお題
.NET Core 3.0 で使える C# 8
Unity2015_No10_~UGUI&Audio~
 
C# 7・8 の復習
20141129-dotNet2015
Visual basic14 の話
C#6.0の新機能紹介
C# 7 Current Status

More from 信之 岩永

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

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 • Discussionsunder 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” CTP3新機能 • 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.
    背景 • declarationexpressions自体は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

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

[8]ページ先頭

©2009-2025 Movatter.jp