[解決済み】C#4.0の「dynamic」型は何に使うの?
質問
C# 4.0では、「dynamic」という新しい型が導入されました。いいことづくめのようだが、プログラマーはこれを何に使うのだろう?
それが窮地を救う場面はあるのでしょうか?
どのように解決するのか?
Dynamic キーワードは C# 4.0 の新機能で、コンパイラに変数の型が変わる可能性があること、または実行時まで型がわからないことを伝えるために使用されます。これは、オブジェクトをキャストすることなく操作できるようになることだと考えてください。
dynamic cust = GetCustomer();
cust.FirstName = "foo"; // works as expected
cust.Process(); // works as expected
cust.MissingMethod(); // No method found!
キャストしたり、cust を Customer 型として宣言する必要がないことに注意してください。ダイナミックに宣言したため、ランタイムがFirstNameプロパティを検索して設定してくれるのです。もちろん、動的変数を使用する場合、コンパイラによる型チェックは放棄することになります。つまり、cust.MissingMethod()の呼び出しはコンパイルされ、ランタイムまで失敗しないことを意味します。この操作の結果は、MissingMethodがCustomerクラスで定義されていないため、RuntimeBinderExceptionとなります。
上記の例では、メソッドやプロパティを呼び出す際に、dynamicがどのように機能するかを示しています。もう一つの強力な(そして潜在的に危険な)機能は、異なるタイプのデータに対して変数を再利用できることです。PythonやRuby、Perlのプログラマーなら、これを利用する方法をいくらでも思いつくと思いますが、私は長い間C#を使ってきたので、「間違っている」と感じてしまいます。
dynamic foo = 123;
foo = "bar";
さて、上記のようなコードを書くことはあまりないでしょう。しかし、変数の再利用が便利なときや、レガシーコードの汚れた部分をきれいにできるときがあるかもしれません。私がよく遭遇する簡単なケースは、10進数とdoubleの間のキャストを常に行わなければならないことです。
decimal foo = GetDecimalValue();
foo = foo / 2.5; // Does not compile
foo = Math.Sqrt(foo); // Does not compile
string bar = foo.ToString("c");
2行目は2.5がdoubleとして型付けされているためコンパイルできません。3行目はMath.Sqrtがdoubleを想定しているためコンパイルできません。もちろん、キャストをしたり、変数の型を変えたりすればいいだけですが、dynamicを使う意味がある場面もあるかもしれません。
dynamic foo = GetDecimalValue(); // still returns a decimal
foo = foo / 2.5; // The runtime takes care of this for us
foo = Math.Sqrt(foo); // Again, the DLR works its magic
string bar = foo.ToString("c");
もっと特集を読む : http://www.codeproject.com/KB/cs/CSharp4Features.aspx
関連
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み] Interopタイプの組み込みができない
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] JSONをC#のダイナミックオブジェクトにデシリアライズする?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] JSONをC#のダイナミックオブジェクトにデシリアライズする?
-
[解決済み】文字列からクラスのインスタンスを作成する