最初に
本記事は「Adaptive Code」で得た知見から掘り下げて記事にしたものとなります。
記事の対象者は以下の知識を持っていることが前提となります。
- C#の基礎的なコードが書けること。
- 動的・静的型付けがわかること。
ダックタイピングとは?
動的に型付が行われる言語ではよく、この「ダックタイピング」が行われます。
ダックタイピングの名前はダックテストに由来します。
「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである。」
つまり、同名のメソッドやプロパティを持つオブジェクトに関しては、等しく扱えることを提案するものです(実際に後述するコードを見た方が直感的にわかりやすいかもしれません)。
C#ではこれをdynamicで実現することができます。インターフェイスを作成しなくても問題ありません。単純に同名及び引数が合っているかどうかを見ています。
dynamic?
C# 4.0で追加された機能です。このdynamicの使い方に戸惑う方が身近に居たので今回紹介も兼ねて記事にしてみた次第です。
元々C# 3.0 以前では、 静的型付けしか行えませんでした。そのため、オブジェクトが持つプロパティ名やメソッド名をコンパイル時に知っておく必要がありました。
このdynamicキーワードを使用することで、CLRの静的な型付けからDLR(Dynamic Language Runtime)の動的型付けに切り替えることが可能となります。以下のコードで登場するpetというプロパティが存在するかどうかは実行時に調べられます。
void dynamic GetPet(dynamic someone)
{
if (someone == null) return;
return someone.pet;
}
実際のコード
using System;
namespace Hoge
{
public class Dog
{
public void Walk()
{
Console.WriteLine("Dog Walk.");
}
}
public class Cat
{
public void Walk()
{
Console.WriteLine("Cat Walk.");
}
}
class Program
{
static void Main(string[] args)
{
var cat = new Cat();
AnimalWalk(cat);
var dog = new Dog();
AnimalWalk(dog);
}
static void AnimalWalk(dynamic animal)
{
if (animal == null) return;
// CatもDogもWalkを実装済み。
animal.Walk();
}
}
}
出力結果:
Cat Walk.
Dog Walk.
メリット
- コードが簡素化されるため見通しが良くなる。
- Pythonのような動的言語との相互運用に便利
- XMLやJSONのようなデータと連携しやすくなる。
デメリット
- 名前のつづり間違いは実行するまでエラーかどうか確認できない。
- ソースは短くなるが、性能面では静的な定義に劣る