c# 泛型

  今天看代码时,发现Dictionary对这个泛型集合类也是一知半解,就好好看了一下它。PS:半路出家的我,快拍我。

  既然知道它是一个泛型集合,必须知道啥是泛型。泛型 C# 2.0 的最强大的功能,它让处理数据更加方便,更提高了类型安全性,还有性能,避免了非泛型集合的重复的装箱和拆箱。不信?看下面的代码分析,就知道它的好处。

平时我们经常碰到一些功能非常相似的模块,只不过传的值不同,比如一种是int,一种是string,这样搞的要写2个方法,如果更多相似的模块呢,这样会使代码非常臃肿,这时会想有没有可能传入一个通用的数据呢。有人一定会想到用Object,一切类型的基类,这样它就可以接收任何数据类型,这是在泛型没出现的时候最不错的方法。可惜,泛型的出现让他暴露了2个致命的缺点。

a,  在使用值类型时,必须将它们装箱以便推送和存储它们,并且在将值类型弹出堆栈时将其取消装箱。装箱和取消装箱都会根据它们自己的权限造成重大的性能损失,但是它还会增加托管堆上的压力,导致更多的垃圾收集工作,而这对于性能而言也不太好。即使是在使用引用类型而不是值类型时,仍然存在性能损失,这是因为必须从 Object 向您要与之交互的实际类型进行强制类型转换,从而造成强制类型转换开销。以栈为例:

    Stack stack = new Stack();   实例一个栈
stack.Push("1");             传进一个字符串
string number = (string)stack.Pop(); 想显示的时候,Pop是返回它的值(Object类型的),因为要赋值给string,所以要强转。

b, 类型安全性。因为编译器允许在任何类型和 Object 之间进行强制类型转换,所以你将丢失编译时类型安全。

Stack stack = new Stack();
stack.Push(1);
string number = (string)stack.Pop();  编译时没问题,但在运行时出错,类型转换异常
 泛型能弥补这些缺点,看下对比,为了篇幅,简化写法了,可以自己去写写看
Object
泛型
public class Stack
{
   Object[] m_Items; 
   public void Push(Object item)
   {...}
   public Object Pop()
   {...}
}
 
public class Stack
{
   T[] m_Items; 
   public void Push(T item)
   {...}
   public T Pop()
   {...}
}
 
Stack stack = new Stack();
stack.Push("1");
string number = (string)stack.Pop();
Stack stack = new Stack();
stack.Push(1);
int number = stack.Pop();
 

:T 是一般类型参数(或类型参数),而一般类型为 StackStack 中的 int 为类型实参。 该编程模型的优点在于,内部算法和数据操作保持不变,而实际数据类型可以基于客户端使用服务器代码的方式进行更改。

Dictionary表示键和值的泛型集合。它通过键来检索值的速度是非常快的,接近于 O(1)(指常数时间),这是因为 Dictionary 类是作为一个哈希表来实现的。

常用属性

Comparer

获取用于确定字典中的键是否相等的 IEqualityComparer

Count

获取包含在 Dictionary中的键/值对的数目。

Item

获取或设置与指定的键相关联的值。

Keys

获取包含 Dictionary中的键的集合。

Values

获取包含 Dictionary中的值的集合。

 

常用的方法

Add

将指定的键和值添加到字典中。

Clear

Dictionary中移除所有的键和值。

ContainsKey

确定 Dictionary是否包含指定的键。

ContainsValue

确定 Dictionary是否包含特定值。

Equals

已重载。 确定两个 Object 实例是否相等。 (从 Object 继承。)

GetEnumerator

返回循环访问 Dictionary的枚举数。

GetHashCode

用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。)

GetObjectData

实现 System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary实例所需的数据。

GetType

获取当前实例的 Type (从 Object 继承。)

OnDeserialization

实现 System.Runtime.Serialization.ISerializable接口,并在完成反序列化之后引发反序列化事件。

ReferenceEquals

确定指定的 Object实例是否是相同的实例。 (从 Object 继承。)

Remove

Dictionary中移除所指定的键的值。

ToString

返回表示当前 Object String (从 Object 继承。)

TryGetValue

获取与指定的键相关联的值

 

例子就自己动手写吧 最好再从网上看些经典例子。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值