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,里面有使用.
LZ有精力的话,可以去看看ObjectBuilder,里面有使用.
#6
public static List<T> FillList<T>(DataTable table) where T : new()
{…}
T 可以是任何类型
比如
调用 你可以这样, 指定类型
FillList<DataSetTest>(DataSetTest.testTable)
{…}
T 可以是任何类型
比如
调用 你可以这样, 指定类型
FillList<DataSetTest>(DataSetTest.testTable)
#7
where T:new()
表示泛型类型需要提供无参构造函数。
今天才说过这个。看这个帖子吧。
http://topic.csdn.net/u/20100623/11/da98fe18-4c90-4f98-a10e-0c8686f94b52.html
表示泛型类型需要提供无参构造函数。
今天才说过这个。看这个帖子吧。
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();
同样,如果指定了接口,那就可以直接使用接口的方法,不需要转换,例如:
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,这里的代码实现了类型安全。
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
哈哈,就是看到你在这个帖子
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类型必须有默认构造函数
泛型约束,约束类型T必须具有无参的构造函数
表示T必须是class类型或它的派生类。
new()构造函数约束允许开发人员实例化一个泛型类型的对象。
一般情况下,无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,要求类型参数必须提供一个无参数的构造函数。
在使用new()约束时,可以通过调用该无参构造函数来创建对象。
基本形式: where T : new()
new()
T类型必须有默认构造函数
#1
这个还是需要在实际开发中,自己去体会吧.......别人说的在多不懂还是不懂....这些东西不是很难...一通百通
什么时候 使用泛型方法.....
当一些类具有一些[ 相同之处],例如:都派生自同一个父类或者都实现了某一个接口....
当你要对这些类进行一些 差不多操作,你就可以考虑用泛型方法.....找出他们的共同点
这样写的代码就少,不需要为每个类去定义一个方法..
什么时候 使用泛型方法.....
当一些类具有一些[ 相同之处],例如:都派生自同一个父类或者都实现了某一个接口....
当你要对这些类进行一些 差不多操作,你就可以考虑用泛型方法.....找出他们的共同点
这样写的代码就少,不需要为每个类去定义一个方法..
#2
谢谢。。我把这个问题问出来了再想想是有点问的不合适。。我就想知道自己在什么情况下也能用下。。问题挂一天吧,看看有没有用这个比较多的人。。
#3
我也想知道
#4
mark
#5
这是对 T 的约束。
LZ有精力的话,可以去看看ObjectBuilder,里面有使用.
LZ有精力的话,可以去看看ObjectBuilder,里面有使用.
#6
public static List<T> FillList<T>(DataTable table) where T : new()
{…}
T 可以是任何类型
比如
调用 你可以这样, 指定类型
FillList<DataSetTest>(DataSetTest.testTable)
{…}
T 可以是任何类型
比如
调用 你可以这样, 指定类型
FillList<DataSetTest>(DataSetTest.testTable)
#7
where T:new()
表示泛型类型需要提供无参构造函数。
今天才说过这个。看这个帖子吧。
http://topic.csdn.net/u/20100623/11/da98fe18-4c90-4f98-a10e-0c8686f94b52.html
表示泛型类型需要提供无参构造函数。
今天才说过这个。看这个帖子吧。
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();
同样,如果指定了接口,那就可以直接使用接口的方法,不需要转换,例如:
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,这里的代码实现了类型安全。
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
哈哈,就是看到你在这个帖子
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类型必须有默认构造函数
泛型约束,约束类型T必须具有无参的构造函数
表示T必须是class类型或它的派生类。
new()构造函数约束允许开发人员实例化一个泛型类型的对象。
一般情况下,无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,要求类型参数必须提供一个无参数的构造函数。
在使用new()约束时,可以通过调用该无参构造函数来创建对象。
基本形式: where T : new()
new()
T类型必须有默认构造函数