Weitere ähnliche Inhalte
Ähnlich wie プログラミング .NET Framework 第4版 (20)
Kürzlich hochgeladen (10)
プログラミング .NET Framework 第4版
- 8. 「第4版」
• 要は、.NET 4 → .NET 4.5 対応
• .NET 4.5 対応のうち、
本書(というかCLR)的に関連深いのは:
• TypeInfo型とType型
• WinRT
• async/await
- 12. Reflection APIの変更
• Type型からTypeInfo型を分離
• .NET 4.5では後方互換性のために“追加”
• .NET Core(ストア アプリ向け)では破壊的変更
• ポータブルな実装したければ、新APIの利用が必要
どうしてこうなったかというと…
• 名前空間整理
(SystemとSystem.Reflection)
• 2種類の型情報
(TypeDefとTypeRef)
- 21. WinRT (Windows Runtime)
• 関連する技術/スタイルはいろいろあるものの
Windows APIを一新
XAML
Windows ストア アプリ
Immersive UI
MS Design Style
C++ ⇔ .NET ⇔ JavaScript相互運用
.NET Core (ストア アプリ向け.NETライブラリ)
C++/CX
WinMD
言語プロジェクション
- 22. WinRT (Windows Runtime)
• CLR (本書)的に関係するのは
Windows APIを一新
XAML
Windows ストア アプリ
Immersive UI
MS Design Style
C++ ⇔ .NET ⇔ JavaScript相互運用
この部分
.NET Core (ストア アプリ向け.NETライブラリ)
C++/CX
WinMD
言語プロジェクション
- 27. 仕組み: IL Tokenタイプ
• Token: 型/メンバーを識別するための4byte整数
• そのうち1byteは、TypeDef/TypeRefのどちらのテー
ブルを探せばいいか、タイプ判定に使う
• (残り3byteはテーブル内のインデックス)
• .NET 4.5で、これに、CLRプロジェクション用
のタイプが増えたみたい
- 34. イテレーター
• 中断と再開
class MethodEnumerator : IEnumerator<int>
{
public int Current { get; private set; }
private int _state = 0;
public bool MoveNext()
{
switch (_state)
{
case 0:
IEnumerable<int> Method()
{
yield return 1;
Current = 1;
_state = 1;
return true;
case 1:
Current = 2;
_state = 2;
return true;
case 2:
yield return 2;
}
}
}
}
default:
return false;
- 35. イテレーター
• 中断と再開
class MethodEnumerator : IEnumerator<int>
{
public int Current { get; private set; }
private int _state = 0;
public bool MoveNext()
{
switch (_state)
{
case 0:
状態の記録
Current = 1;
Current = 1;
_state = 1;
_state = 1;
return true;
中断
return 1:
case true;
case 1: = 2;
Current
_state = 2;
return true; 再開用のラベル
IEnumerable<int> Method()
{
yield return 1;
yield return 2;
case 2:
}
}
}
}
default:
return false;
- 36. awaitの展開結果(コンセプ
ト)
• コンセプト的には イテレーター +
ContinueWith
状態の記録
async Task<int> Method()
{
var x = await task1;
var y = await task2;
}
_state = 1;
if (!task1.IsCompleted)
{
task1.ContinueWith(a);
return;
中断
}
再開用のラベル
case 1:
var x = task1.Result;
結果の受け取り