連載:C# 4入門

第1回 dynamic型

株式会社ピーデー 川俣 晶
2010/07/16
Page1 Page2 Page3

dynamic型

 C#は従来より、コンパイル時に定義を知らないオブジェクトが持つ情報にアクセスすることができる。リフレクションという機能を使うだけでよい。しかし、これはいうほど容易ではなかった。

using System;
using System.Reflection;

class A
{
  public readonly string MyName = "山田太郎";
  public static object GetObjectA() { return new A(); }
}

class Program
{
  static void Main(string[] args)
  {
    object a = A.GetObjectA();
    var name = a.GetType().GetField("MyName").GetValue(a);
    Console.WriteLine(name);
  }
}
リスト3 リフレクションを使ったメンバのアクセス

山田太郎
リスト3の実行結果

 見てのとおり、メソッドMainはどのような型のオブジェクトが返ってきたのか何も知らないが、リフレクションの機能で、それに属するフィールドの値を得ることができている。つまり、これはいわゆる「動的」な処理である。

 C# 4で導入されたdynamic型は、これを大幅に簡素化してくれる。

using System;

class A
{
  public readonly string MyName = "山田太郎";
  public static dynamic GetObjectA() { return new A(); }
}

class Program
{
  static void Main(string[] args)
  {
    dynamic a = A.GetObjectA();
    Console.WriteLine(a.MyName);
  }
}
リスト4 dynamic型を使ったメンバのアクセス

 もちろん、MainメソッドはGetObjectAメソッドから返ってきたオブジェクトがA型であるとはまったく知らないが、MyNameという名前のフィールドの値を参照することができている。これは、単に名前が一致しているという理由でアクセス可能になっているだけであり、リフレクションを使った例(リスト3)と機能的には同じである。

 ちなみに、名前の一致はコンパイル時ではなく実行時にチェックされるため、つづりを間違えてもコンパイル・エラーではなく、実行時に例外を出すことになる。また、実行時に目的の名前を持つメンバを探す関係上、実行速度も遅くなりがちである。

ダック・タイピング

 dynamic型の特徴の1つは、定義がなくてもアクセスできることだが、ある状況では定義があってもdynamic型を経由しないとアクセスできないことがある。

 以下は2つの「鳥」をクラスとして定義しているが、特に継承関係はない。まったく独立した存在である。このような場合、普通の方法では「鳴け」メソッドは記述できない。別の実装にアクセスできるとしても、あくまで特定の宣言に対する呼び出しを行うからである。このように継承関係がない場合は、共通の定義もなく、呼び出すことはできない。しかし、dynamic型を経由してしまうと、名前や引数や型さえ一致していれば呼び出せてしまう。

using System;

class 醜いアヒルの子
{
  public void 鳴く()
  {
    Console.WriteLine("くわっ! by 醜いアヒルの子");
  }
}

class 白鳥
{
  public void 鳴く()
  {
    Console.WriteLine("くわっ! by 白鳥");
  }
}

class Program
{
  private static void 鳴け(dynamic 鳥)
  {
    鳥.鳴く();
  }

  static void Main(string[] args)
  {
    鳴け((dynamic)new 醜いアヒルの子());
    鳴け((dynamic)new 白鳥());
  }
}
リスト5 dynamic型経由のアクセス

くわっ! by 醜いアヒルの子
くわっ! by 白鳥
リスト5の実行結果

 このような「名前が同じで、同じように振る舞うなら、同じものである」というやり方を「ダック・タイピング」などの用語で呼ぶこともある。dynamic型は、それをC#で行うハードルを一気に下げてくれたといえる。


 INDEX
  C# 4入門
  第1回 dynamic型
    1.C# 4がやってきた
  2.dynamic型/ダック・タイピング
    3.dynamic型と匿名型/dynamic型と動的言語/まとめ
 
インデックス・ページヘ  「C# 4入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間