ホームページ  >  記事  >  バックエンド開発  >  C#学習日記30---ジェネリッククラス、ジェネリックメソッド、ジェネリックデリゲート

C#学習日記30---ジェネリッククラス、ジェネリックメソッド、ジェネリックデリゲート

黄舟
黄舟オリジナル
2017-01-21 15:46:351328ブラウズ

ジェネリックを使用すると、プログラムで実際に使用されるまで、クラスまたはメソッド内のプログラミング要素のデータ型の仕様の書き込みを延期できます。つまり、クラスやメソッドを宣言する際、ユーザーがどのような型のパラメータを渡したいのかが分からないため、型を渡す「穴(“<T>”)を掘る」ことになります。それを使用して、特定のデータ型を入力します。

ジェネリッククラス:

これまで学んだ知識をもとにクラスを定義します:

 class Data
          {
              public int  n_data;
           }

このとき、n_dataのデータ型はint型と決まっているので、それに値を代入する際にはと書き換えると、 int 型のみになります。

 class Data<T>
             {
               public T n_data;
             }

この時点では、n_data のデータ型がどのような型であるかまだ決まっていないので、代入する際に指定する必要があります。穴を埋めるn_dataの型であるT、

 Data<int> data = new Data<int>();    //指定T为int
  Data<string> data = new Data<string>();  //指定T为string

もちろん、上記の例では、n_dataの型を配列にする場合、Tを配列として指定することはできません。次の例は満たすことができます:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Example  
{  
    class Data<T> //泛型类  
    {  
        public T[] n_data; //泛型变量  
       public Data(int size) //构造方法,new的时候调用构造方法开辟空间  
        {   
          n_data = new T[size];    
        }  
        //输入  
       public void setdata(int index,T value)  
       {  
           n_data[index] = value;  
       }  
        //输出  
       public T getdata(int x)  
       {   
          return n_data[x];  
       }  
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Data<int> data = new Data<int>(5);  
            data.n_data[2] = 2;  
           Console.WriteLine(data.n_data[2]);  
        }  
    }  
}

結果は: 2

汎用メソッド:

これには swap を使用します Exchange メソッドを例に取ると、C++ の swap 関数は次のように記述されます:

#include <iostream>  
  
using namespace std;  
template <typename T>  
void swap1(T &a,T &b) //也可以看作泛型  
{  
  T temp;  
  temp = a;  
  a = b;  
  b = temp;  
}  
int main()  
{  
    int a=0,b=1;  
    swap1(a,b);  
    cout<<a<<"\t"<<b<<endl;  
      return 0;  
}

Result: 0
a と b が文字型の場合、上記の関数も適用できます。 C#swap メソッドは次のとおりです:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Example  
{  
    class data  
    {//swap方法,ref是按地址传递  
        public static void swap<T>(ref T a, ref T b)  
        {  
            T temp;  
            temp = a;  
            a = b;  
            b = temp;  
        }  
        static void Main(string[] args)  
        {  
            string a = "HC";  
            string b = "666";  
            swap(ref a,ref b);  
            Console.WriteLine(a+"\t"+b); //结果 666    HC  
        }  
    }  
}

結果: 666 HC++ これは C++

と非常によく似ています。

汎用デリゲート:

上記の例に従って、汎用デリゲートもあります:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Example  
{  
    public delegate void MyDelegate<T>();//泛型委托  
    class Data<T>  
    {  
        private T a;  
        private T b;  
        public void setvalue(T x, T y)  
        {  
            a = x;  
            b = y;  
        }  
        //swap方法,ref是按地址传递  
        public void swap()  
        {  
            T temp;  
            temp = a;  
            a = b;  
            b = temp;  
        }  
        public void printvalue()  
        {  
            Console.WriteLine(a + "\t" + b);  
  
        }  
  }  
      class program  
       {   
         static void Main(string[] args)  
          {  
            Data<string> data = new Data<string>();  
            data.setvalue("HC","666");  
            MyDelegate<string> my = new MyDelegate<string>(data.swap);  
            my += data.printvalue;  
            my();  //结果 666  HC        
           }  
          
       }  
        
   }


結果:

C#学習日記30---ジェネリッククラス、ジェネリックメソッド、ジェネリックデリゲート

ジェネリックについては以上です。間違いがあればお気軽に指摘してください^_^

上記は C# 学習日記 30 の内容です ---ジェネリック クラス、ジェネリック メソッド、ジェネリック デリゲート、その他関連 PHP の中国語に注意してくださいコンテンツについては、Web サイト (www.php.cn) を参照してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。