1. ホーム
  2. c#

[解決済み】C#4.0の「dynamic」型は何に使うの?

2022-04-15 07:01:07

質問

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