dynamic - Microsoft

Download Report

Transcript dynamic - Microsoft

T3-308
大野 元久
デベロッパー エバンジェリスト
マイクロソフト株式会社
※本資料に掲載されている情報は発表時点に予定されているものであり、予告
なく変更される可能性があります。
C# 3.0
C# 2.0
C# 1.0
LINQ(統合言語クエリ)
ジェネリック
マネージコード
Declarative
Dynamic
Concurrent
What
How
命令型
(Imperative)
宣言型
(Declarative)
動的言語
静的言語
単純かつ簡潔
堅牢
型付けは暗黙的
実行エンジン
メタプログラミング
インテリジェントツー
ル
コンパイル不要
高いスケーラビリティ
C# 4.0
C# 3.0
C# 2.0
C# 1.0
動的プログラミング
LINQ(統合言語クエリ)
ジェネリック
マネージコード
動的に型付けされるオブジェクト
省略可能で名前付きのパラメータ
COM相互運用性の改善
共変性と反変性
IronPython
IronRuby
C#
VB.NET
その他
動的言語ランタイム(Dynamic Language Runtime)
Expression Tree
Object
Binder
JavaScript
Binder
Dynamic Dispatch
Python
Binder
Call Site Caching
Ruby
Binder
COM
Binder
Calculator calc = GetCalculator();
int sum = calc.Add(10, 20);
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add",
BindingFlags.InvokeMethod, null,
new object[] { 10, 20 });
int sum = Convert.ToInt32(res);
ScriptObject calc = GetCalculator();
object res = calc.Invoke("Add", 10, 20);
int sum = Convert.ToInt32(res);
dynamic という
静的な型付け
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
動的変換
動的なメソッド呼
び出し
実行時の型が
実行時の型が
dynamic
System.Int32
dynamic x = 1;
dynamic y = "Hello";
dynamic z = new List<int> { 1, 2, 3 };
オペランドが dynamic であれば
• メンバー選択は実行時に先送りされる
• 実行時には、dynamic が実際の型に置き換えられる
• 演算の静的な結果型は dynamic になる
public static class Math
{
public static decimal Abs(decimal value);
public static double Abs(double value);
public static float Abs(float value);
メソッドはコンパイル時に
public static int Abs(int value);
選択される:
public static long Abs(long value);
double Abs(double x)
public static sbyte Abs(sbyte value);
public static short Abs(short value);
...
double x = 1.75;
}
メソッドは実行時に
double y = Math.Abs(x);
選択される:
double Abs(double x)
dynamic x = 1.75;
dynamic y = Math.Abs(x);
メソッドは実行時に
選択される:
dynamic x = 2;
int Abs(int x)
dynamic y = Math.Abs(x);
public abstract class DynamicObject : IDynamicObject
{
public virtual object GetMember(GetMemberBinder info);
public virtual object SetMember(SetMemberBinder info, object value);
public virtual object DeleteMember(DeleteMemberBinder info);
public virtual object UnaryOperation(UnaryOperationBinder info);
public virtual object BinaryOperation(BinaryOperationBinder info, object arg);
public virtual object Convert(ConvertBinder info);
public virtual object Invoke(InvokeBinder info, object[] args);
public virtual object InvokeMember(InvokeMemberBinder info, object[] args);
public virtual object CreateInstance(CreateInstanceBinder info, object[] args);
public virtual object GetIndex(GetIndexBinder info, object[] indices);
public virtual object SetIndex(SetIndexBinder info, object[] indices, object value);
public virtual object DeleteIndex(DeleteIndexBinder info, object[] indices);
public MetaObject IDynamicObject.GetMetaObject();
}
public StreamReader OpenTextFile(
string path,
Encoding encoding,
bool detectEncoding,
int bufferSize);
public StreamReader OpenTextFile(
string path,
Encoding encoding,
bool detectEncoding);
public StreamReader OpenTextFile(
string path,
Encoding encoding);
public StreamReader OpenTextFile(
string path);
本来のメソッド
オーバーロード
デフォルト値とともに
基本メソッドを呼び出す
public StreamReader OpenTextFile(
string path,
Encoding encoding
encoding,= null,
bool detectEncoding
detectEncoding,= true,
int bufferSize
bufferSize);
= 1024);
省略可能なパラメータ
名前付き引数
OpenTextFile("foo.txt", Encoding.UTF8);
OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096);
名前付きの引数では
指定順序は無関係
引数は記述された
順に評価される
OpenTextFile(
bufferSize: 4096,
path: "foo.txt",
detectEncoding: false);
名前付き引数は
最後に配置する
省略可能でないパラ
メータは常に指定する
object fileName = "Test.docx";
object missing = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,
ref missing, ref missing,
ref missing, ref missing,
ref missing, ref missing,
ref missing, ref missing,
ref missing, ref missing,
ref
ref
ref
ref
ref
missing,
missing,
missing,
missing,
missing);
doc.SaveAs("Test.docx");
オートメーション オブジェクトからダイナミッ
ク オブジェクトへのマッピング
省略可能な、名前付きパラメータ
インデックスされたプロパティ
省略可能な “ref” 修飾子
組み込みの相互運用型 (“非PIA”)
string[] strings = GetStringArray();
Process(strings);
void Process(object[] objects) { … }
objects[0] = "Hello";
// Ok
objects[1] = new Button(); // 実行時エラー!
}
List<string> strings = GetStringList();
Process(strings);
void Process(IEnumerable<object> objects) { … }
// IEnumerable<T> は読み込み専用
// したがって安全な共変性がある
}
.NET の配列型は
共変性がある
…しかし、安全な共
変性ではない
これまで、C# の
ジェネリックは
共変性がなかった
C# 4.0 では
安全な共変性、
反変性がある
public interface IEnumerable<out
IEnumerable<T> T>
{
IEnumerator<T> GetEnumerator();
}
out = 共変性は
出力側のみ
派生元の型として
扱うことができる
public interface IEnumerator<out
IEnumerator<T> T>
{
IEnumerable<string> strings = GetStrings();
T Current { get; }
IEnumerable<object> objects = strings;
bool MoveNext();
}
in = 反変性は
入力側のみ
public interface IComparer<in
IComparer<T> T>
{
int Compare(T x, T y);
}
派生先の型として
扱うことができる
IComparer<object> objComp = GetComparer();
IComparer<string> strComp = objComp;
インターフェースとデリゲート型をサポート
“静的にチェックされた定義時の変性”
値型には変性がない
IEnumerable<int> はIEnumerable<object> では
ない
既存の配列型に対する規則と類似
ref と out パラメータは変性のない型が必
要
インターフェース
System.Collections.Generic.IEnumerable<out T>
System.Collections.Generic.IEnumerator<out T>
System.Linq.IQueryable<out T>
System.Collections.Generic.IComparer<in T>
System.Collections.Generic.IEqualityComparer<in T>
System.IComparable<in T>
デリゲート
System.Func<in T, …, out R>
System.Action<in T, …>
System.Predicate<in T>
System.Comparison<in T>
System.EventHandler<in T>
C# 4.0
C# 3.0
C# 2.0
C# 1.0
動的プログラミング
LINQ(統合言語クエリ)
ジェネリック
マネージコード
Clas
s
メタプログラミング
public
言語の
オブジェクトモデル
Foo
入力-評価-出力の
繰り返し
Field
private
X
DSL の埋め込み
string
ソース
ファイル
Source
code
Source code
コンパイラ
.NET
アセンブリ
Source
code
Source code
関連セッション
T3-403: Dynamic Language Runtime: .NET の新しいライ
ブラリ ※開催済
T3-402: XAML 2009:.NET における宣言型プログラミン
グの進化 ※開催済
T3-301: Visual Basic “10” ※開催済
T3-310: F#入門(本日17:30~)
C# 情報
http://code.msdn.microsoft.com/csharpfuture/
http://msdn.microsoft.com/ja-jp/vcsharp/
http://csharp.net/(英語)
講師のブログ
http://blogs.msdn.com/mohno/
© 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market
conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.