Eyes, JAPAN Blog > C#のジェネリック

C#のジェネリック

Masanori Akiyama

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

こんにちは、アルバイトの秋山です。HTC viveを買ったものの私のパソコンのスペックでは使うことができなかったので、この夏休みにバイトしてVR ReadyなPCを買いました。

詳細としては、

CPU・・・インテル Core i7-6700

グラフィック・・・NVIDIA GeForce GTX1060 6GB

メモリ・・・16GB DDR4 SDRAM

といった感じです。会社の方でもVRのお仕事をもらうことができたのでこのパソコンとHTC viveで頑張っていきますっ!


 

〜C#のジェネリック〜

最近Unityの方でジェネリックを使う機会が多くなってきたので、今回はUnity開発で主に使われる言語、C#のジェネリックについて書いていこうと思います。

まず、ジェネリックプログラミング(generic programming)とはデータ形式に依存しないコンピュータプログラミング方式のことです。

—Wikipediaより

 

クラスのインスタンス時生成時に、そのメンバの型を決定するようなクラスをジェネリッククラスと言います。

※ジェネリッククラスの例

class MyClass<T> {
    public T x;
    public int show(T n) {
        . . .
    }
}

 

この例での、型Tが何の型なのかは、インスタンス生成時までわかりません。Tは「型パラメータ」と呼ばれます。通常アルファベットの大文字一字でおかれることが多いですが、小文字にしたり、TYPE1といった感じで複数の文字で表すことも可能です。インスタンスの生成は、

MyClass<int> MC = new MyClass<int> ();

とかきます。クラス定義でTとしたところがに置き換わりますっ!つまり上のコードは

class MyClass {
    public int x;
    public int show(int n) {
        . . .
    }
}

と定義したのと同じことになります!

ジェネリックを使ったサンプルコード1↓

// genericTest1.cs

using System;

class GeneticTest<T> {
    public T val;
    public T getVal() {
        return val;
    }
}

class genericTest1 {
    public static void Main() {

        GeneticTest<int> class1 = new GeneticTest<int>();
        class1.val = 44;
        Console.WriteLine(class1.getVal());

        GeneticTest<string> class2 = new GeneticTest<string>();
        class2.val = nowhere;
        Console.WriteLine(class2.getVal());

    }
}

Console.WriteLine()はCでいうprintfです。このコードの出力結果は、

44

nowhere

です。

また複数のパラメータを受け取れるジェネリッククラスを作ることもできます!

サンプルコード2↓

// genericTest2.cs

using System;

class GenericTest<T, U> {
    public T[] a;
    public U[] b;

    public GenericTest(int n) {
        a = new T[n];
        b = new U[n];
    }
}

class genericTest2 {
    public static void Main() {

        Console.Write(入力個数を決めてください\nn = );
        string strTest = Console.ReadLine();

        if(!Char.IsDigit(strTest[0])) {
            Console.WriteLine(不適切なものが入力されました);
            return;
        }

        int n = int.Parse(strTest);

        GenericTest<int, string> gt = new GenericTest<int, string>(n);

        for(int i = 0; i < n; i++) {

            Console.Write(No  );
            string str = Console.ReadLine();
            if(!Char.IsDigit(str[0])) {
                Console.WriteLine(不適切なものが入力されました);
                break;
            }

            gt.a[i] = int.Parse(str);

            Console.Write(Name  );
            string name = Console.ReadLine();
            gt.b[i] = name;

        }

        Console.WriteLine();

        for(int i = 0; i < n; i++) {
            Console.WriteLine([{0}] {1}, gt.a[i], gt.b[i]);
        }

    }
}

入力:

3, 44, Akiyama, 1, EJ, 404, nowhere

出力結果は・・・

入力個数を決めてください

n = 3

No — 44

Name — Akiyama

No — 1

Name — EJ

No — 404

Name — nowhere

[44] Akiyama

[1] EJ

[404] nowhere

 

となります。

 

最近私はUnityでコードを書いていると必ずといっていいほどジェネリックはでてきます。私は他の人のUnityのコードをあまりじっくり見たことがありませんので確証はもてませんが、きっとこのジェネリックプログラミングはUnityでの製作に必須なスキルなのではないでしょうか?私自身、まだC#を勉強してからまだ半年も経っていない未熟者です。これからもっと勉強して自分の想像するものを形にできるようにスキルを磨いていけたらなと思います。

Comments are closed.