这篇文章主要为大家展示了“C#如何自定义泛型类”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#如何自定义泛型类”这篇文章吧。
成都创新互联是一家集网站建设,伊犁企业网站建设,伊犁品牌网站建设,网站定制,伊犁网站建设报价,网络营销,网络优化,伊犁网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
Generic是Framework 2.0的新元素,中文名字称之为“泛型” ,特征是一个带有尖括号的类,比如List< T>
C#自定义泛型类用得最广泛,就是集合(Collection)中。实际上,泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题(如果对装箱和拆箱概念不明,请百度搜索)。由于泛型的使用,使得集合内所有元素都属于同一类,这就把类型不同的隐患消灭在编译阶段——如果类型不对,则编译错误。
这里只讨论C#自定义泛型类。基本自定义如下:
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,必定具有某些的属性,那么我们就可以在MyGeneric< T>中使用T的这些属性。这一点,是通过interface来实现的。
// 先定义一个interface public interface IDocument ...{ string Title ...{get;} string Content ...{get;} } // 让范型类T实现这个interface public class MyGeneric < T> where T : IDocument ...{ public void Method(T v) ...{ Console.WriteLine(v.Title); } } // 传入的类也必须实现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; } // 调用 public void Run() ...{ int i,j; i = 3; j = 5; delegateSample< int> sample = new delegateSample< int> (Swap); sample(i, j); }
设置可空值类型:一般来说,值类型的变量是非空的。但是,Nullable< T>可以解决这个问题。
Nullable< int> x; // 这样就设置了一个可空的整数变量x x = 4; x += 3; if (x.HasValue) // 使用HasValue属性来检查x是否为空 ...{ Console.WriteLine ("x="+x.ToString()); } x = null; // 可设空值
使用ArraySegment< T>来获得数组的一部分。如果要使用一个数组的部分元素,直接使用ArraySegment来圈定不失为一个不错的办法。
int[] arr = ...{1, 2, 3, 4, 5, 6, 7, 8, 9}; // ***个参数是传递数组,第二个参数是起始段在数组内的偏移,第三个参数是要取连续多少个数 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属性来访问传递的数组 }
在例子中,通过将Offset属性和Count属性设置为不同的值,可以达到访问不同段的目的。
以上是“C#如何自定义泛型类”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!