黑马程序员技术交流社区
标题: C#泛型的疑惑 [打印本页]
作者: 孔健 时间: 2013-3-10 19:13
标题: C#泛型的疑惑
一直以来,对泛型不是很理解.泛型到底是什么?有什么作用?还有类型参数T又有什么用?
请高手们多多指教,详细说一下,最好能给出几个有助于理解的简单点的例子. 谢谢....
作者: 孔健 时间: 2013-3-10 19:46
马先强 发表于 2013-3-10 19:38
我的理解就是 键和值。。。就像一个播放器,的播放列表,用泛型实现排序。。
...
不明白,能具体说说吗..
作者: luxun1912 时间: 2013-3-10 19:59
1、泛型是一种特殊的类型。泛型无须类型的转换操作。
2、泛型可以保证类型安全。泛型集合对它所存储的对象做了类型约束,不是它所允许存储的类型是无法添加到泛型集合中的。
private void btnMyClassTest_Click(object sender, EventArgs e)
{
List<Student> students = new List<Student>();
Student scofield = new Student("Scofield", Genders.Male, 28, "越狱狱");
Student zhang = new Student("张靓靓", Genders.Female, 20, "唱歌歌");
Student jay = new Student("周杰杰", Genders.Male, 21, "耍双节棍棍");
Teacher jacky = new Teacher("成龙龙", 4);
students.Add(scofield);
students.Add(zhang);
students.Add(jay);
//students.Add(jacky); //编译时立即报错
//打印集合数目
MessageBox.Show(string.Format("班级 共包括 {0} 个成员。",
students.Count.ToString()));
foreach (Student stu in students)
{
Console.WriteLine(stu.Name);
}
}
作者: 董华阳 时间: 2013-3-11 08:25
所谓泛型是指将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。
一种类型占位符,或称之为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显好处是——类型安全和减少装箱、拆箱。
作者: 孔健 时间: 2013-3-11 11:10
luxun1912 发表于 2013-3-10 19:59
1、泛型是一种特殊的类型。泛型无须类型的转换操作。
2、泛型可以保证类型安全。泛型集合对它所存储的对象 ...
你好,看你的这个例子,我怎么感觉泛型和数组差不多呢,都是用来存储同类型数据的一个"容器".
作者: 孔健 时间: 2013-3-11 11:13
董华阳 发表于 2013-3-11 08:25
所谓泛型是指将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。
一种类型占位符,或称之为 ...
你好,减少装箱\拆箱该怎样解释呢?
作者: luxun1912 时间: 2013-3-11 20:58
本帖最后由 luxun1912 于 2013-3-11 21:05 编辑
孔健 发表于 2013-3-11 11:10
你好,看你的这个例子,我怎么感觉泛型和数组差不多呢,都是用来存储同类型数据的一个"容器". ...
泛型集合不用再进行装箱和拆箱了,数组存储不可以动态添加,ArrayList再添加元素时候都是Object类型的,如果添加一个值类型,就需要把它转换为引用类型,而取出这个元素时有需要转换为它对应的值类型。值类型→引用类型=装箱,反之叫拆箱。
作者: 孔健 时间: 2013-3-11 21:26
luxun1912 发表于 2013-3-11 20:58
泛型集合不用再进行装箱和拆箱了,数组存储不可以动态添加,ArrayList再添加元素时候都是Object类型的,如 ...
有泛型使用的实例呀?简单点的,复杂了看不懂..
作者: jdedffjef83j 时间: 2014-12-1 17:55
class Program
{
static void Main(string[] args)
{
int obj = 2;
Test<int> test = new Test<int>(obj);
Console.WriteLine("int:" + test.obj);
string obj2 = "hello world";
Test<string> test1 = new Test<string>(obj2);
Console.WriteLine("String:" + test1.obj);
Console.Read();
}
}
class Test<T>
{
public T obj;
public Test(T obj)
{
this.obj = obj;
}
}
输出结果是:
int:2
String:hello world
1、 Test是一个泛型类。T是要实例化的范型类型。如果T被实例化为int型,那么成员变量obj就是int型的,如果T被实例化为string型,那么obj就是string类型的。
就是说,我定义一个类型,这个类型定义的时候并没有确定是什么数据类型,而一旦实例化之后,这个类型就确定了。提高了灵活性。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |