C#で動的型付けを使ってみる(dynamic)

はいどーもこんばんはダイナミック無職です。
本日は動的型付けもといdynamicについて調べてみようと思いますよ。
なおこの記事は『More Effective C#』を参考にして書いています。

dynamicってなんやねん

C#ではdynamicキーワードを使うと、静的な型付けではなく動的な型付けになります。
C#は一般的に静的な型付けです。
ダックタイピング的な動きをしようと思うと、リフレクションをおこなう必要があります。
対してJavaScriptは動的な型付けをおこないます。
例えば以下のJavaScriptコードを見てください。

なんてことはない、単純なコードです。
Hoge型とFuga型はどちらもexecuteメソッドを持っています。
これらのインスタンスを配列にpushし、forEachを使ってexecuteメソッドを呼んでいます。

静的型付けになれていると「継承もしていないし、たまたまexecuteメソッドを共通していて持っているだけじゃないか」と思うかもしれません。
実際その通りで、もしC#でこれと似た動きをさせるなら、おそらく多くの人はインターフェイスを利用するでしょう。
ですがJavaScriptは型の概念が薄いため、ダックタイピング的な上記のコードが可能なのです。

これと同じことをしよう、というのがdynamicキーワードです(たぶん)。

とりあえず使ってみる

というわけでさっそく使ってみましょう。
サンプルコードをドン。

非常にシンプルなコードです。
DynamicTestクラスのAddメソッドは、leftとrightと足します。
+演算子が実装されている型なら、このコードはどんな型に対しても有効となります。
実際、整数同士の足し算、文字列の連結、日付の足し算、は全て問題なく動きます。
ただし以下のようなコードは実行時にエラーが出ます。

これは+演算子が実装されていないためです。
コンパイルの段階ではエラーが出ないため、まさにJavaScriptみたいな感じですね。

dynamicは伝播する

上記のAddメソッドはdynamic型を返します。
このdynamic型はあらゆる型を受け付けますが、ほとんどの場合は「局所的にdynamic型を受け付けたいが、全体にはdynamicを伝播させたくない」でしょう。
なぜならdynamic型は静的型付けのメリットの大部分を失ってしまうからです。
最も大切なことは実行速度でしょう。また、インテリセンスも働きません。
というわけで、可能であるならばdynamicはあるクラスに閉じ込めておき、そのクラスの使用者からはdynamicであることがわからないのが理想的らしいです。

例えば先程のDynamicTestは以下のように書き換えられるでしょう。

先程のコードと使い方も同じですが、戻り値はそれぞれの引数に従って変わります。
これならdynamic型はDynamicTestの中に閉じ込められており、外に出てくることはありません。

終わりに

いかがでしたでしょーか。
僕は普段dynamicなんて全然使っていないのですが、使える箇所はそれなりにあるのだなあと思いました。
ただなるべくきちんと型を指定して使いたいですし、まずは型を指定する方向がC#では正道な気がしました。
あと単純に、難しい使い方をしようと思うとドンドン沼にはまっていきそうですコレw

ほなそんな感じでまた。

フォローする