Category Archives: 仕分け中

C#ジェネリックって何?


アニメ『BANANA FISH』

原作は別冊少女コミックに連載された漫画ですが、なんと1985年の漫画です。本アニメは、作者の吉田秋生氏の画業40周年記念プロジェクトの一環でアニメ化されたものらしいです。
感想ですが、これはまとめて見た方がいいアニメかも。息をつく暇もないアクション三昧で、まるでハリウッド映画を見てるよう。数話で止めてしまうと、せっかくの雰囲気が壊れてしまいます。映画館を退場したような気分とでもいうのでしょうか。と言いつつ、続きが気になるので、全話完了を待たずしてつい見てしまう面白さ。いやあアニメ好きで良かった。

劇中、薬物の謎解きが出てきますが、薬物で思い出したのが、ジェネリック医薬品
ずっとこのジェネリックの意味が分かってませんでした。後発医薬品というぐらいだから、ジェネリックは、後からできたって意味かと思ってたんですが、まったく違いました。辞書(https://en.oxforddictionaries.com)を見ると、

形容詞、名詞、どちらもgenericなのですが、正直、ここに書いてある内容はよくわかりません。

こちらの辞書(https://dictionary.cambridge.org)では、事情が日本と同じなのか、後発医薬品っぽいことが書いてありますね。ん~。オックスフォードとケンブリッジってそんなに離れてない気がしますが。

結局、意味は分からず仕舞いなのですが、その他いろいろネットで調べて、たどり着いた結論は、
generic=general-purpose=汎用的な、って覚え方が一番忘れにくいんじゃないか、と思いました。

で、C#のジェネリック。

C#に限らず、ジェネリックプログラミングというプログラミングスタイルがあり、
データ型に依存しないプログラミングらしいです。プログラミング言語MLが草分けのようで、1973年からある技術です。まあ当時からジェネリックプログラミングと呼ばれていたかは不明ですが。
古いものは新しいですねえ。

では、C#のジェネリッククラスについて。
今の私のスキルでは、オーバーロード(多重定義)しなくて済む、ぐらいしか知識がありません。
例です。

オーバーロードを使用した場合。

C:\Users\takk\tmp>type t.cs
public class GenericTest
{
	double b;
	public double Get()
	{
		return b;
	}
	public void Set(double a)
	{
		b = a;
	}
	public void Set(int a)
	{
		b = (double)a;
	}
}
class Test
{
    static void Main()
    {
	var a1 = new GenericTest();
	a1.Set(5.2);
	System.Console.WriteLine("{0}",a1.Get() );

	var a2 = new GenericTest();
	a2.Set(3);
	System.Console.WriteLine("{0}",a2.Get() );
    }
}

ぜんぜん面白くないサンプルなんですが、オーバーロードとジェネリックを対比できるかと思います。というより無理やり対比しています。

では、ジェネリッククラスを使用した場合。

C:\Users\takk\tmp>type t.cs
public class GenericTest<T>
{
	T b;
	public T Get()
	{
		return b;
	}
	public void Set(T a)
	{
		b = a;
	}
}
class Test
{
    static void Main()
    {
	var a1 = new GenericTest<double>();
	a1.Set(5.2);
	System.Console.WriteLine("{0}",a1.Get() );

	var a2 = new GenericTest<int>();
	a2.Set(3);
	System.Console.WriteLine("{0}",a2.Get() );
    }
}

C#でジェネリッククラスを使うことで、どれほど可読性が上がるのかは正直分かりません。優れたプログラマーであれば、言語に組み込まれているジェネリック構文云々を使わなくとも、ジェネリックプログラミングできると思うんですよね。