掌握C#⾃定义泛型类:从初始化说起
C#⾃定义泛型类⽤得最⼴泛的就是在集合(Collection)中。本⽂介绍了C#⾃定义泛型Generic的⽤法。
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是否为空
writeline方法属于类
.
..{ 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属性来访问传递的数组
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。