C#泛型概述

来源:互联网 发布:手机电缆报价软件 编辑:程序博客网 时间:2024/05/17 02:47
泛型允许创建“类型参数”的代码,即:泛型代码在声明的时候并不特定于具体的数据类型,而是使用的时候才去制定数据类型。

泛型参数可以是值类型或者应用类型。

C#提供了泛型类、泛型接口、泛型结构、泛型委托和泛型方法这几种类型。

.NET Framework类库中提供了大量基于泛型实现的类,System.Collections.Generic命名空间中的List<T>类似最常见的一种。以下为用List<T>创建一个整形数组。
List<int> list = new List<int>();list.Add(1);//不需要装箱list.Add(2);int num1=list[0];//list 包含的元素都是int类型,故不需要类型转换



对ArrayList类型的集合来说,它的元素类型为object,也就是说可以向集合中添加任意类型的数据:
ArrayList list=new ArrayList();list.Add(1);list.Add("hello");list.Add(DateTime.Now);


由此可见它不可能成为一种类型安全的集合,但是泛型则可以,因为在创建时我们就必须指定类型T为什么。


泛型类


与普通类一样,泛型类也支持继承,它可以继承自具体的类,或者实现泛型接口,而且还可以指定基类的类型参数来定义基于特定类型的子类。
如下我们可能需要一个键的类型为int的字典类:
    
class MyDictionary<TVuale> : Dictionary<int, TVuale>    {    }    class Program    {        static void Main(string[] args)        {            MyDictionary<string> myDict = new MyDictionary<string>();            myDict.Add(1, "hello");            Console.WriteLine(myDict[1]);            Console.ReadLine();            //myDict.Add("key","value")//编译失败        }    }

泛型类的静态变量只能被类型参数相同的类说共享。如:

   
 class SimpleGeneric<T>//此处为泛型类的声明    {        public SimpleGeneric(T value)         {             Value=value;         }        public T Value { get; private set;}        public static int n;    }    class Program    {        static void Main(string[] args)        {            SimpleGeneric<int>.n = 4;            SimpleGeneric<string>.n = 6;            Console.WriteLine(SimpleGeneric<int>.n);            Console.WriteLine(SimpleGeneric<string>.n);            Console.ReadLine();        }    }


由此可见,SimpleGeneric<int>与 SimpleGeneric<string>作为 SimpleGeneric<T>类的具体实现,它们是两个不同的类,故不会共享静态成员、

泛型方法

.NET的泛型允许在泛型类,非泛型类、结构和接口中定义泛型方法。同泛型类一样,泛型方法在声明时也拥有一个类型参数。
泛型方法的声明形式如下:
class Program    {        static void Main(string[] args)        {            int n = 6;            DateTime date = DateTime.Now;            SetToDefault(ref n);            SetToDefault(ref date);            Console.WriteLine(n);            Console.WriteLine(date);            Console.ReadLine();        }        static void SetToDefault<T>(ref T value)        {            value = default(T);        }    }


注意调用SetToDefault<T>这个泛型方法时并没有指定类型参数,这是因为编译器能够自动推断参数的类型。
以下写法是错误的:
class MyMath{    public T test<T>(T value)    {        return value + value;    }}


C#中不能再泛型方法中对泛型参数使用加、减等运算符,因为C#泛型没有运算符约束。但是我们可以创建泛型接口,并实现接口来解决这类问题,因为接口中并没有提供方法的实现。
如:
interface IMath<T>{    T Add(T value1,T value2);}class MyMath:IMath<T>{    public T test<T>(T value)    {        return value + value;    }}


原创粉丝点击