讨论关于C# 泛型!!

hanhanmj 2009-06-11 02:10:38

最近看到不少关于谈论List<T>的贴子..更多的人是在问关于泛型的用法!
特发此贴,希望各路高手们综合讨论下关于List<T>的用法,运行机制,优缺点等..
希望真正用到过的朋友们谈谈自己的理解或想法,而不是网上找一段Ctrl+C Ctrl+V 一下...

问: 拿泛型方法来说..

public IList<T> Tmp(){//...} 与 public DataSet Tmp(){//...} 之间的区别.. 内在的运行机制?


希望大家踊跃发言!


...全文
209 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
LYC_liyinchuan 2011-11-07
  • 打赏
  • 举报
回复
我觉得在实战中或许会得到更好的答案,当可以做出一点东西的时候就能写出来了。
dongjunlong 2010-10-13
  • 打赏
  • 举报
回复
5L的很详细啊
Error_Code 2009-06-11
  • 打赏
  • 举报
回复
lovvver 2009-06-11
  • 打赏
  • 举报
回复
范型,就相当于c++中的模板
wym0807 2009-06-11
  • 打赏
  • 举报
回复
泛型到底是个什么概念啊???
yanm7788 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lovvver 的回复:]
引用 12 楼 Hack95 的回复:
我通常拿泛型当链表用,非常好用。
而且不但元素个数可变,每个元素还可以不同类型。



如果多个参数的类型都不一致,范型就派不上用场了,使用List <object>的话就是避长就短了。对于多参数,建议创建一个类来处理,用一个类实例来代替过多的参数。
[/Quote]
....
lovvver 2009-06-11
  • 打赏
  • 举报
回复
关于范型的使用,建议大家学习一下刚才一个兄弟发的代码:
在这段代码里,充分利用范型的模板功能,是一个完整的桥模式的应用。将操作者和操作对象解耦,操作者可以任意变化,操作对象也可以任意变化。


public class GenericFormatter<F> : IGenericFormatter where F : IFormatter, new()
{
IFormatter m_Formatter = new F();

/// <summary>
/// Deserializes the specified serialization stream.
/// </summary>
/// <param name="serializationStream">The serialization stream.</param>
/// <returns></returns>
public T Deserialize<T>(Stream serializationStream)
{
return (T)m_Formatter.Deserialize(serializationStream);
}
/// <summary>
/// Serializes the specified serialization stream.
/// </summary>
/// <param name="serializationStream">The serialization stream.</param>
/// <param name="graph">A parameter of the generics Type T</param>
public void Serialize<T>(Stream serializationStream, T graph)
{
m_Formatter.Serialize(serializationStream, graph);
}
}
lovvver 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Hack95 的回复:]
我通常拿泛型当链表用,非常好用。
而且不但元素个数可变,每个元素还可以不同类型。
[/Quote]

如果多个参数的类型都不一致,范型就派不上用场了,使用List<object>的话就是避长就短了。对于多参数,建议创建一个类来处理,用一个类实例来代替过多的参数。
cicilool 2009-06-11
  • 打赏
  • 举报
回复
1:集合容量可增
2:避免装箱、拆箱
正宗熊猫哥 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lovvver 的回复:]
范型的基本优点在于好用,数组长度是动态的;安全,指定了T的类型;减少了开销,避免了以前ArrayList或Hashtable中将object类和具体类之间相互转换所带来的开销。
高一点的用法:范型提供了一种很好的复制手段,且提高了扩展性。例如,可以自己定义范型类,如ValidateObject <T>,用于校验对象,然后根据自己的需要,扩充校验对象类,而扩充的只是新对象的具体校验部分,而仍然可以使用这个校验抽象类,提高了扩展性,复用了代码…
[/Quote]

虽然才用过几次,并且还不怎么熟练。但是深有感触
xxyping 2009-06-11
  • 打赏
  • 举报
回复
实在
柳晛 2009-06-11
  • 打赏
  • 举报
回复
要说用法,一个函数参数过多,用一个泛型代替,也算用法吧。
柳晛 2009-06-11
  • 打赏
  • 举报
回复
我通常拿泛型当链表用,非常好用。
而且不但元素个数可变,每个元素还可以不同类型。
lovvver 2009-06-11
  • 打赏
  • 举报
回复
public IList <T> Tmp(){//...} 与 public DataSet Tmp(){//...} 之间的区别.. 内在的运行机制?
-----------------
IList<T>的返回值类型和DataSet的返回值类型,没有可比性,这是两种取数的方式。
Mrwuying 2009-06-11
  • 打赏
  • 举报
回复
泛型,就是可以进行数据类型的约束。有些新的特性是集合等不曾有的。
自己看看C#书吧。
十八道胡同 2009-06-11
  • 打赏
  • 举报
回复
查msdn,
十八道胡同 2009-06-11
  • 打赏
  • 举报
回复
顶下。

类似于c++中的template,主要是类型转换的效率问题吧。。
zealot1021 2009-06-11
  • 打赏
  • 举报
回复
太深的理解谈不上,就是感觉操作简单方便,而且性能的提高是显而易见的,是一个很好的数据容器。
zenowolf 2009-06-11
  • 打赏
  • 举报
回复
就是C++的template Class~
cdd1012 2009-06-11
  • 打赏
  • 举报
回复
泛型的概念
(1)没有泛型的时候,所有的对象都是以object为基础,如果要使用时必须进行强制类型转换,如果对于值类型,则会导致不断拆箱装箱的过程,对系统消耗很大。
(2)使用泛型时不需要通过object类进行装箱拆箱,使用的时候都会是确定的类型。
(3)泛型的概念一开始是由集合引入,因为集合中的类型都是基于object类。可以在集合中使用泛型类。
(4)泛型不仅仅用于集合,还可以用于委托、接口和方法。
泛型的优点:高性能
ArrayList list1 = new ArrayList();
list1.Add(44); //装箱
int il1 = (int)list1[0];//拆箱
foreach (int i2 in list1)
Console.WriteLine(i2); //执行拆箱

频繁的拆箱、装箱操作在没有泛型的时候反复进行,对系统资源消耗很大。可以使用泛型集合。

List<int> list2 = new List<int>();
list2.Add(44); //不执行装箱
int il2 = list2[0];//不执行拆箱
foreach (int i2 in list2)
Console.WriteLine(i2); //不执行拆箱

泛型在定义的时候就区分了值类型和引用类型。

泛型的优点:类型安全
ArrayList list = new ArrayList();
list.Add(44);
list.Add("mystring");
list.Add(new MyClass());
foreach (int i in list)
Console.WriteLine(i);

类型安全在于提前避免异常的出现。

List<int> list2 = new List<int>();
list2.Add(44);
//list2.Add("mystring");
//list2.Add(new MyClass());
直接编译不通过。


泛型的优点:代码的重用与扩展
List<T>这个泛型类在使用时可以根据需要用不同的类型实例化:

List<int> list=new List<int>();
list.Add(44);

List<string> stringList=new List<string>();
stringList.Add(“mystring”);

List<MyClass> myclassList=new List<MyClass>();
myClassList.Add(new MyClass());

泛型的优点:代码的重用与扩展

定义一个泛型类:
public class aaa<T> 注意:这里的T只是一个标识而已,定义成任何字符都可以。
{
public void abc(T a)
{
Console.WriteLine(a);
}
}

使用它:
//使用string实例化
aaa<string> aaa = new aaa<string>();
aaa.abc("aaabbb");
//使用int实例化
aaa<object> bbb = new aaa<object>();
bbb.abc(new object());
Console.Read();
命名约定
(1)泛型类型的名称用字母T作为前缀。
(2)使用泛型时,使用<T>,如:
Public class List<T> {}
Public class Linkedlist<T>{}
(3)如果泛型类型有特定的要求(例如必须实现一个派生于基类的接口),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称:
比如:
public interface ccc<TTT>
{ void abc(TTT arg1); }
public class aaa<TTT>:ccc<TTT>
{ public void abc(TTT a)
{ Console.WriteLine(a); } }

Public class SortedList<TKey,Tvalue>{}

泛型集合
泛型集合存在于using System.Collections.Generic下.我们主要介绍如下List<T> ,其它的泛型集合使用请查阅MSDN。
加载更多回复(4)

110,579

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧