今天逛CSDN看帖子的时候无意发现这么一段代码:public static List<T> FillList<T>(DataTable table) where T : new()
{…}一下傻眼了,List<>知道是泛型列表,后面where T : new()这是啥东西,用C#做了一年多ERP还是头一次见定义函数这样,也从来没用过,用到过泛型大多也就是类似string<>这样用来存放数据比较方便。查了下MSDN才知道后面是对泛型类型的一种约束,还有其他Icomparable,Ienumerable等等约束。这些约束的作用也有解释,除了泛型方法还有这样泛型类:public class MyGenericClass<T> where T:IComparable { }
但还是困惑,因为没有用过这种用法,想了半天始终没有想到这个泛型类和泛型方法的作用在哪,或者说在实际开发中可以干什么,比起普通的类和方法特别用它有什么意义?
求教各位大虾!

解决方案 »

  1.   

    这是对 T 的约束。
    LZ有精力的话,可以去看看ObjectBuilder,里面有使用.
      

  2.   

    public static List<T> FillList<T>(DataTable table) where T : new()
    {…}T 可以是任何类型 
    比如调用 你可以这样, 指定类型   
    FillList<DataSetTest>(DataSetTest.testTable) 
      

  3.   

    where T:new()
    表示泛型类型需要提供无参构造函数。
    今天才说过这个。看这个帖子吧。
    http://topic.csdn.net/u/20100623/11/da98fe18-4c90-4f98-a10e-0c8686f94b52.html
      

  4.   

    有了这一句where T : new(),你就可以在代码里面使用new T()来创建对象了,
    同样,如果指定了接口,那就可以直接使用接口的方法,不需要转换,例如:
    where T : Iabc new()
    T t = new T();
    t.xyz();
      

  5.   

    所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。 .NET中的许多语言如C#,C++和VB.NET都是强类型语言。作为一个程序员,当你使用这些语言时,总会期望编译器进行类型安全的检查。然而,当谈到.NET 1.0和1.1中的集合时,它们是无助于类型安全的。比如一个ArrayList的例子,它拥有一个对象集合--这允许你把任何类型的对象放于该ArrayList中。让我们看一下例1中的代码。
    using System;
    using System.Collections;
    namespace TestApp
    {
    class Test
    {
    [STAThread]
     static void Main(string[] args)
      {   ArrayList list = new ArrayList();
            list.Add(3);  
              list.Add(4);   
              //list.Add(5.0);  
             int total = 0;   
            foreach(int val in list)  
              {   
              total = total + val;  
               }  
              Console.WriteLine("Total is {0}", total); 
        } 
      }

    本例中,我们建立了一个ArrayList的实例,并把3和4添加给它。然后循环遍历该ArrayList,从中取出整型值然后把它们相加。这个程序将产生结果“Total is 7”。现在,如果我们注释掉下面这句: list.Add(5.0);  程序将产生异常: 哪里出错了呢?记住ArrayList拥有一个集合的对象。当你把3加到ArrayList上时,你已把值3装箱了。当你循环该列表时,你是把元素拆箱成int型。然而,当你添加值5.0时,你在装箱一个double型值。在第17行,那个double值被拆箱成一个int型。这就是失败的原因。 
    作为一个习惯于使用语言提供的类型安全的程序员,希望这样的问题在编译期间浮出水面,而不是在运行时刻。这正是泛型产生的原因。
    .NET 2.0的System.Collections.Generics 命名空间包含了泛型集合定义。各种不同的集合/容器类都被"参数化"了。为使用它们,只需简单地指定参数化的类型即可。请看例2:
    例2.类型安全的泛型列表
    List<int> aList = new List<int>();
    aList.Add(3);
    aList.Add(4);
    // aList.Add(5.0);
    int total = 0;
    foreach(int val in aList)
    {  total = total + val; }
    Console.WriteLine("Total is {0}", total); 
    在例2中,我们编写了一个泛型的列表的例子,在尖括号内指定参数类型为int。该代码的执行将产生结果"Total is 7"。现在,如果去掉语句doubleList.Add(5.0)的注释,将得到一个编译错误。编译器指出它不能发送值5.0到方法Add(),因为该方法仅接受int型。不同于例1,这里的代码实现了类型安全。
      

  6.   

    需要的话给邮箱 发个PPT给你……
      

  7.   

    哈哈,就是看到你在这个帖子
    http://topic.csdn.net/u/20100614/17/ff8d7593-5b97-4bf3-8ac1-4637e912aa36.html
    里面你在3楼的代码我才开始研究这个的,你没看我那个方法和你在那写的一模一样吗~没想到你在其他帖子里又说了这个问题
    谢谢大家,我先看看~
      

  8.   

    比如你可以用泛型做一个通用的undo redo类。比如可以用上面这个函数删除所有表里面的空行。
      

  9.   

    where T:
    泛型约束,约束类型T必须具有无参的构造函数
    表示T必须是class类型或它的派生类。
    new()构造函数约束允许开发人员实例化一个泛型类型的对象。  
    一般情况下,无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,要求类型参数必须提供一个无参数的构造函数。  
    在使用new()约束时,可以通过调用该无参构造函数来创建对象。  
    基本形式: where T : new()  
     
    new()   
    T类型必须有默认构造函数