掌握C#自定义泛型类:从初始化说起
2009-10-28 21:31
190 查看
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#自定义泛型类的用法介绍。
相关文章推荐
- 【转】掌握C#自定义泛型类:从初始化说起
- 从枚举的初始化说起 [C#]
- C# App.config 自定义 配置节 报错“配置系统未能初始化” 解决方法
- 自定义的Troop<T>泛型类( c++, java和c#)的实现代码
- C# App.config 自定义 配置节 出现的问题:配置系统未能初始化
- C# App.config 自定义 配置节 报错“配置系统未能初始化” 解决方法
- C# 自定义泛型类,并添加约束
- 从枚举的初始化说起 [C#]
- C#自定义泛型类绑定ComboBox控件
- 【C#】自定义数组默认初始化
- 对于c#中,在完成自定义用户控件然后重新生成无效的可能解决办法。
- C#自定义ConfigSections节
- [C#]变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- 自定义软件安装界面(c#)
- C#在无参构造器中初始化成员变量
- 在C#中使用自定义消息
- C# 反射通过GetCustomAttributes方法,获得自定义特性
- C#自定义命名空间与使用自定义的命名空间方法
- C# PrintDocument 自定义打印纸张大小和方向