溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#如何自定義泛型類

發(fā)布時間:2021-12-01 14:00:54 來源:億速云 閱讀:269 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“C#如何自定義泛型類”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“C#如何自定義泛型類”這篇文章吧。

Generic是Framework 2.0的新元素,中文名字稱之為“泛型” ,特征是一個帶有尖括號的類,比如List< T>

C#自定義泛型類用得最廣泛,就是集合(Collection)中。實際上,泛型的產(chǎn)生其中一個原因就是為了解決原來集合類中元素的裝箱和拆箱問題(如果對裝箱和拆箱概念不明,請百度搜索)。由于泛型的使用,使得集合內(nèi)所有元素都屬于同一類,這就把類型不同的隱患消滅在編譯階段——如果類型不對,則編譯錯誤。

這里只討論C#自定義泛型類?;咀远x如下:

public class MyGeneric < T>  ...{      private T member;      public void Method (T obj)      ...{      }  }

這里,定義了一個泛型類,其中的T作為一個類,可以在定義的類中使用。當然,要定義多個泛型類,也沒有問題。

public class MyGeneric < TKey, TValue>  ...{       private TKey key;       private TValue value;        public void Method (TKey k, TValue v)       ...{       }  }

泛型的初始化:泛型是需要進行初始化的。使用T doc = default(T)以后,系統(tǒng)會自動為泛型進行初始化。

限制:如果我們知道,這個將要傳入的泛型類T,必定具有某些的屬性,那么我們就可以在MyGeneric< T>中使用T的這些屬性。這一點,是通過interface來實現(xiàn)的。

// 先定義一個interface  public interface IDocument  ...{     string Title ...{get;}     string Content ...{get;}  }   // 讓范型類T實現(xiàn)這個interface  public class MyGeneric < T>  where T : IDocument  ...{       public void Method(T v)       ...{            Console.WriteLine(v.Title);       }  }   // 傳入的類也必須實現(xiàn)interface  public class Document : IDocument  ...{  ......  }   // 使用這個泛型  MyGeneric< Document> doc = new MyGeneric< Document>();

泛型方法:我們同樣可以定義泛型的方法

void Swap< T> (ref T x, ref T y)  ...{  T temp = x;  x = y;  y = temp;  }

泛型代理(Generic Delegate):既然能夠定義泛型方法,自然也可以定義泛型代理

public delegate void delegateSample < T> (ref T x, ref T y)   private void Swap (ref T x, ref T y)  ...{      T temp = x;      x = y;      y = temp;  }   // 調(diào)用  public void Run()  ...{     int i,j;     i = 3;     j = 5;     delegateSample< int> sample = new delegateSample< int> (Swap);     sample(i, j);  }

設(shè)置可空值類型:一般來說,值類型的變量是非空的。但是,Nullable< T>可以解決這個問題。

Nullable< int> x;   // 這樣就設(shè)置了一個可空的整數(shù)變量x  x = 4;  x += 3;  if (x.HasValue)   // 使用HasValue屬性來檢查x是否為空  ...{ Console.WriteLine ("x="+x.ToString());  }  x = null;    // 可設(shè)空值

使用ArraySegment< T>來獲得數(shù)組的一部分。如果要使用一個數(shù)組的部分元素,直接使用ArraySegment來圈定不失為一個不錯的辦法。

int[] arr = ...{1, 2, 3, 4, 5, 6, 7, 8, 9};  // ***個參數(shù)是傳遞數(shù)組,第二個參數(shù)是起始段在數(shù)組內(nèi)的偏移,第三個參數(shù)是要取連續(xù)多少個數(shù)  ArraySegment< int> segment = new ArraySegment< int>(arr, 2, 3);  // (array, offset, count)    for (int i = segment.Offset; i< = segment.Offset + segment.Count; i++)  ...{     Console.WriteLine(segment.Array[i]);    // 使用Array屬性來訪問傳遞的數(shù)組  }

在例子中,通過將Offset屬性和Count屬性設(shè)置為不同的值,可以達到訪問不同段的目的。

以上是“C#如何自定義泛型類”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI