首页 > 代码库 > 泛型的理解

泛型的理解

泛型:
一直对这个概念都觉着迷糊,经过最近的阅读,自己有了一定的理解,现分享给大家。
从字面的意思理解来看,泛型,泛就是模糊、暂不确定暂定的意思。本人这样理解为,
使用泛型就是,定义的一个类型,类型暂不确定,给使用给一个占位符给代替,在使用的时候可以给确定其定义的类型。
下面附上eg:

public static PageList<T> ToPageList<T>(this IQueryable<T> source, int page, int size)
{
if (page <= 0 || size <= 0)
{
return new PageList<T>(new List<T>().AsQueryable(), 1, 10);
}
else
{
return new PageList<T>(source, page, size);
}
}

public static PageList<T> ToPageList<T>(this IList<T> source, int page, int size, int count)
{
if (page <= 0 || size <= 0)
{
return new PageList<T>(new List<T>().AsQueryable(), 1, 10);
}
else
{
return new PageList<T>(source, page, size, count);
}
}

public static PageList<T> ToPageList<T>(this List<T> source, int page, int size, int count)
{
if (page <= 0 || size <= 0)
{
return new PageList<T>(new List<T>().AsQueryable(), 1, 10);
}
else
{
return new PageList<T>(source, page, size, count);
}
}

public static PageList<T> ToPageList<T>(this IEnumerable<T> source, int page, int size, int count)
{
if (page <= 0 || size <= 0)
{
return new PageList<T>(new List<T>().AsQueryable(), 1, 10);
}
else
{
return new PageList<T>(source, page, size, count);
}
}


在这段代码中,使用的是泛型方法ToPageList<T>,定义的这个方法在使用的过程中给其使用到的实际的参数(类型参数)有IQueryable<T>、List<T>、IList<T>、IEnumerable<T>。
这与通常的那些定义的最大区别是,方法的定义实现过程只有一个。但是它具有处理不同的数据类型数据的能力。
从白话文的理解之后,看一下官方的解释。
泛型为使用c#语言编写面向对象程序增加了极大的效力和灵活性。允许程序员在强类型程序设计语言中编写代码时《定义一些可变部分》,定义的实际的数据类型的规约延迟至泛型的实例被创建时才确定。

将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了(将泛型理解为)《类型参数》这个概念。

泛型是具有占位符(类型参数)的《类、结构、接口和方法》,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。

上面是一个方法泛型,经常看到的是泛型集合,集合泛型,也就是泛型一般都是和集合类型在一起使用的。
最常见的泛型集合类List<T>:
static void Main(string[] args)
{
List<int> l = new List<int>();
l.Add(1);
}
另一个比较常用的泛型集合类是Dictionary<T,T>,用于保存键值对:
static void Main(string[] args)
{
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "SomeBook1");
dict.Add(2, "SomeBook2");
dict.Add(3, "SomeBook3");

Console.WriteLine(dict[2]);//output:SomeBook2
dict[2] = "SomeCD1";//modify
Console.WriteLine(dict[2]);//output:SomeCD1

dict.Remove(2);//delete

foreach (KeyValuePair<int, string> kv in dict)
{
Console.WriteLine("Key = {0}, Value = http://www.mamicode.com/{1}",kv.Key, kv.Value);
}
}