この章のテーマ §
dynamic型について学びます。dynamic型は、動的プログラミングを可能とします。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, メソッドの基礎, string型
解説 §
世の中には型指定が存在しないプログラミング言語があります。その方が効率が良い、学習しやすいと考える人たちがいるからです。そのような型のないプログラミングを動的プログラミングと言います。
C# では、dynamic型を使用すると動的プログラミングができます。dynamic型はコンパイラが一切の型チェックをやめる機能です。dynamic型は、本当の型ではなく実体はありません。
dynamic型を使用するにはintやvarなどを使用せず、型としてdynamicと書くだけでよく、とても簡単です。
しかし、実際にdynamic型はあまり使われていません。dynamic型には以下の弱点もあるからです。
- 綴りなどが間違っていてもコンパイラはエラーにしない
- 実行時の効率が良くない
- 入力時のインテリセンスで候補リストが出てこない
dynamic型が使用されるのは【C#の側での型定義が存在しないオブジェクトを扱いたい】場合や、【ダックタピングをやりたい】などの限られた場面になっているようです。
ダックタイピングとは、【見た目が同じなら同じである】という考え方で、サンプルソースの2つのSayメソッドのようなものです。これらは別々のクラスにあって相互に継承関係は存在しませんが、見た目が同じなので同じものとして扱いたいニーズが存在することがあります。こう言うときは、dynamic型でスマートに解決できます。
罠の数々 §
- dynamic型を使ってもエラーは減らせない。単にコンパイルの時に検出できなかったエラーが実行時に例外などを起こすだけである
- 従って使っても楽はできない。むしろ手間は増える。コンパイル時にエラーが分かった方が素早く対処できるからだ
参考リンク §
dynamic 型の使用 (C# プログラミング ガイド)
サンプルソース: kw_dynamic §
sub(new A());
sub(new B());
void sub(dynamic p)
{
p.Say("HELLO!");
}
class A
{
public void Say(string message) => Console.WriteLine($"{message} from A");
}
class B
{
public void Say(string message) => Console.WriteLine($"{message} from B");
}
実行結果 §
HELLO! from A
HELLO! from B
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
dynamic a = new A();
a.sub("Hello!");
class A
{
void sub()
{
Console.WriteLine("called");
}
}
- Hello!
- called
- 何も出力しない
- コンパイルエラー
- 実行時例外
[[解答]]