很感谢组织给我一次讲课的机会。本次讲的是泛型,看过一遍.NEt之美,回过头来再看的时候,发现很多以前没看懂得东西,现在再次的翻开书看的时候,发现我能理解很多,同时也能根据自己动手敲代码发现新的问题。
Why
先看一段排序的代码:
//冒泡排序
public class SortHelper
{
public void BubbleSort( int[] array)
{
int length = array.Length;
for (int i = 0; i <= length - 2; i++)
{
for (int j = length - 1; j >= 1; j--)
{
// 对两个元素进行交换
if (array[j] < array[j - 1])
{
int temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
class Program
{
static void Main(string[] args)
{
SortHelper sorter = new SortHelper();
int[] array = { 8, 1, 4, 7, 3 };
sorter.BubbleSort(array);
foreach (int i in array)
{
Console.Write("{0} ", i);
}
Console.WriteLine();
Console.ReadKey();
}
}
这是一段对Int型数组进行排序。如果我要对char类型和byte类型进行排序又是如何?
难道我们要这样做吗?
我们会发现,这样做的虽然第一次复制,效率要高一些,但是第二次,呢,但是这样做,确实加重了服务器的负担。如果这个功能以后不再扩展了,那么我们就没必要花费大把的时间去做一个很Perfect的方案,但是这个功能以后还是要用的,所以我们要完善一下下。
这时候我们就想到了——泛型。
What
泛型是程序设计语言的一种特性。将类型参数化以达到代码复用提高软件开发工作的效率的一种数据类型。其实他也是一种数据类型。使用泛型,能提高代码复用率,使得代码更加灵活。
How
修改我们之前的Demo
public class Book : IComparable
{
private String name;
private int price;
public String Name
{
get{ return this.name;}
}
public Int32 Price
{
get { return this.price; }
}
public Book(string name, int price)
{
this.name = name;
this.price = price;
}
//s实现接口,要告诉它返回什么类型的,根据什么进行比较
public int intCompareTo(object obj)
{
Book book = (Book)obj;
return this.price.CompareTo(book.price);
}
}
//泛型约束
public interface IComparable
{
int intCompareTo(Object obj);
}
public class SortHelper<T> where T : IComparable
{
public void BubbleSort(T[] array)
{
int length = array.Length;
for (int i = 0; i <= length - 2; i++)
{
for (int j = length - 1; j >= 1; j--)
{
// 对两个元素进行交换
if (array[j].intCompareTo(array[j - 1]) < 0)
{
T temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{
Book[] BookArry = new Book[2];
Book book1 = new Book(".Net之美", 123);
Book book2 = new Book("Java讲义", 45);
BookArry[0] = book1;
BookArry[1] = book2;
SortHelper<Book> sorter = new SortHelper<Book>();
sorter.BubbleSort(BookArry);
foreach (Book h in BookArry)
{
Console.WriteLine("name:{0}", h.Name);
Console.WriteLine("price{0}\n", h.Price);
}
}
}
这样修改了我们的代码。为什么在最开始的时候我就说一定要动手操作,只有动手了才能知道这个泛型约束的作用。因为我们不确定T是什么类型的,我们要给他一个约束,这就是类型约束,在比较的时候,比如说是两本书进行比较,我们也不知道是比较名称还是比较价钱,这也用到了约束。根据以上代码,可以大概了解一下泛型约束。
总结:
为什么用泛型,有一句话:fool me once,shame on you;fool me towice,shame on me.愚弄我一次,是你的不对,愚弄我两次,是我的过失。泛型提高代码的复用率,给我们节省了很多时间,同时使用泛型也会是电脑运行速度变快,这个如果大家做过.Net之美上边的例子就会懂得。同时泛型也会和反射结合起来,这也是常见的一种写法,不管是和谁结合,但是他们最终的目的都是一样的,提高代码的复用率。