泛型类和泛型方法的应用

时间:2021-12-04 19:25:06
今天逛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 { }


但还是困惑,因为没有用过这种用法,想了半天始终没有想到这个泛型类和泛型方法的作用在哪,或者说在实际开发中可以干什么,比起普通的类和方法特别用它有什么意义?
求教各位大虾!

17 个解决方案

#1


这个还是需要在实际开发中,自己去体会吧.......别人说的在多不懂还是不懂....这些东西不是很难...一通百通

什么时候 使用泛型方法.....

当一些类具有一些[ 相同之处],例如:都派生自同一个父类或者都实现了某一个接口....

当你要对这些类进行一些 差不多操作,你就可以考虑用泛型方法.....找出他们的共同点

这样写的代码就少,不需要为每个类去定义一个方法..

#2


谢谢。。我把这个问题问出来了再想想是有点问的不合适。。我就想知道自己在什么情况下也能用下。。问题挂一天吧,看看有没有用这个比较多的人。。

#3


我也想知道

#4


mark

#5


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

#6


public static List<T> FillList<T>(DataTable table) where T : new()
{…}

T 可以是任何类型 
比如

调用 你可以这样, 指定类型   
FillList<DataSetTest>(DataSetTest.testTable) 

#7


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

#8


学习了~

#9


将数据类型当成参数传递

#10


这是一个模版类..可以加载所有的类.用户动态设用不同的类..

#11


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

#12


这是基础啊,T是对泛型种类的约束,方便写一些方法

#13


所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。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,这里的代码实现了类型安全。

#14


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

#15


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

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

#16


比如你可以用泛型做一个通用的undo redo类。

比如可以用上面这个函数删除所有表里面的空行。

#17


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

#1


这个还是需要在实际开发中,自己去体会吧.......别人说的在多不懂还是不懂....这些东西不是很难...一通百通

什么时候 使用泛型方法.....

当一些类具有一些[ 相同之处],例如:都派生自同一个父类或者都实现了某一个接口....

当你要对这些类进行一些 差不多操作,你就可以考虑用泛型方法.....找出他们的共同点

这样写的代码就少,不需要为每个类去定义一个方法..

#2


谢谢。。我把这个问题问出来了再想想是有点问的不合适。。我就想知道自己在什么情况下也能用下。。问题挂一天吧,看看有没有用这个比较多的人。。

#3


我也想知道

#4


mark

#5


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

#6


public static List<T> FillList<T>(DataTable table) where T : new()
{…}

T 可以是任何类型 
比如

调用 你可以这样, 指定类型   
FillList<DataSetTest>(DataSetTest.testTable) 

#7


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

#8


学习了~

#9


将数据类型当成参数传递

#10


这是一个模版类..可以加载所有的类.用户动态设用不同的类..

#11


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

#12


这是基础啊,T是对泛型种类的约束,方便写一些方法

#13


所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。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,这里的代码实现了类型安全。

#14


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

#15


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

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

#16


比如你可以用泛型做一个通用的undo redo类。

比如可以用上面这个函数删除所有表里面的空行。

#17


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