Heim  >  Artikel  >  Backend-Entwicklung  >  C#-Lerntagebuch 30 --- Generische Klassen, generische Methoden, generische Delegaten

C#-Lerntagebuch 30 --- Generische Klassen, generische Methoden, generische Delegaten

黄舟
黄舟Original
2017-01-21 15:46:351290Durchsuche

Generika ermöglichen es Ihnen, das Schreiben der Spezifikation des Datentyps eines Programmierelements innerhalb einer Klasse oder Methode aufzuschieben, bis es tatsächlich in Ihrem Programm verwendet wird. Mit anderen Worten: Da wir beim Deklarieren einer Klasse oder Methode nicht wissen, welche Art von Parametern der Benutzer übergeben möchte, „graben wir ein Loch („<T>“)“, wo der Typ übergeben wird. Wenn wir Wenn Sie es verwenden, füllen wir es mit bestimmten Datentypen aus.

Generische Klasse:

Basierend auf dem Wissen, das wir zuvor gelernt haben, definieren wir eine Klasse:

 class Data
          {
              public int  n_data;
           }

Zu diesem Zeitpunkt der Datentyp von n_data wurde als int-Typ bestimmt, daher kann es beim Zuweisen eines Werts nur vom int-Typ sein, wenn es als die folgende generische Klasse umgeschrieben wird:

 

 class Data<T>
             {
               public T n_data;
             }

Zu diesem Zeitpunkt ist der Datentyp von n_data noch nicht sicher. Wenn Sie ihm also einen Wert zuweisen, müssen Sie T angeben, den Typ von n_data, der die Lücken füllen soll

 

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

Im obigen Beispiel kann T natürlich nicht angegeben werden. Wenn der Typ von n_data ein Array sein soll, kann das folgende Beispiel erfüllt werden:

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]);  
        }  
    }  
}

Das Ergebnis ist: 2

Generische Methode:

Das ist, was wir tun. Am Beispiel der Swap-Exchange-Methode wird die Swap-Funktion in C++ wie folgt geschrieben:

#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;  
}

Ergebnis: 1 0
Wenn a und b Zeichentypen sind, sind die oben genannten Funktionen ebenfalls anwendbar. C#swap-Methode lautet wie folgt:

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  
        }  
    }  
}

Ergebnis: 666 HC Dies ist sehr ähnlich zu C++

Generischer Delegat:

Dort delegieren sind auch Generika, folgend dem obigen Beispiel:

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        
           }  
          
       }  
        
   }


Ergebnis:

C#-Lerntagebuch 30 --- Generische Klassen, generische Methoden, generische Delegaten

Das ist alles über Generika, was sonst noch? Fehler beseitigen^_^

Das Obige ist der Inhalt von C# Learning Diary 30 – generische Klassen, generische Methoden und generische Delegaten. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.org). .php .cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn