对Hashtable进行简单重写 和 扩展

  工作中,我们常常需要用到Hashtable保存数据 ,再添加、获取和移除键值时往往要重复的进行 null 值的判断,而且常常抛出“指定的键不存在" 或 ”已添加项。字典中的关键字:“Key”所添加的关键字:“Key” 的异常。这使得我们要反复的判断‘Key’是否存在。于是面向对象的三大特性之一:继承就可以派上用场了。(三大特性为:继承、多态、封装)

  继承分为实现继承(继承一个基类型)和 接口继承(只继承了函数的签名),这里主要说的是实现继承。通过继承 ,我们可以在派生类中使用关键字 override 来重写基类中声明为 virtual 的属性和方法。也可以加入为自己量身定做的扩展方法和属性,下面代码是作者在工作中封装的一个类 ,该类继承自HashTable,重写了基类部分方法和属性 ,同时也封装了一些定制的方法 ,其中有许多不足甚至错误,还望路过的朋友指出,谢谢。

/**********************************************
* 类 名 称: HashTableEx
*
* 命名空间: SystemClassExtend.Util
*
* 作 者: DreamDays
*
* 说 明: 对 Hashtable 类进行简单重写、扩展
*
* 时 间:2012年04月07日
********************************************
*/
using System.Collections;

namespace SystemClassExtend.Util
{
public class HashTableEx : Hashtable
{
/// <summary>
///获取 或 设置 带有指定键的元素
/// </summary>
/// <param name="key">要获取或设置其值的键</param>
/// <returns></returns>
public override object this[object key]
{
get
{
//判断null值
if (key==null)
{
return null;
}
lock (this)
{
//是否存在该键 避免异常
if (ContainsKey(key))
{
return base[key];
}
else
{
return null;
}
}
}
set
{
if (key == null)
{
return;
}
lock (this)
{
base[key] = value;
}
}
}

/// <summary>
/// 从HashTableEx 中 移除带有指定键的元素
/// </summary>
/// <param name="key">要移除的元素的键</param>
public override void Remove(object key)
{
if (key == null)//判断null值
{
return;
}
lock (this)
{
if (ContainsKey(key))//是否存在该键 避免异常
{
base.Remove(key);
}
}
}

/// <summary>
/// 将带有指定键和值的元素添加到HashTableEx中
/// ,如果该键已经存在 则将该键指定的旧值改为新值
/// </summary>
/// <param name="key">要添加的元素的键</param>
/// <param name="value">要添加的元素的值</param>
public virtual void AddOrOverride(object key, object value)
{
if (key == null)
{
return;
}
lock (this)
{
if (ContainsKey(key))
{
base[key] = value;
}
else
{
base.Add(key, value);
}
}
}

/// <summary>
/// 获取带有指定键的元素 ,并从HashTableEx中移除指定键的元素
/// </summary>
/// <param name="key">要添加的元素的键</param>
/// <returns></returns>
public virtual object GetAddRemove(object key)
{
if (key == null)
{
return null;
}
object o = null;
lock (this)
{
if (ContainsKey(key))
{
o = base[key];
base.Remove(key);
}
return o;
}
}
/// <summary>
/// 将带有指定键和值的元素添加到HashTableEx中
/// ,如果存在指定的键,则取消添加元素
/// </summary>
/// <param name="key">要添加的元素的键</param>
/// <param name="value">要添加的元素的值</param>
public override void Add(object key, object value)
{
if (key == null)
{
return;
}
lock (this)
{
//是否存在该键 ,避免抛出异常
if (ContainsKey(key))
{
return;
}
base.Add(key, value);
}
}
/// <summary>
/// 创建HashTableEx 的浅表副本
/// </summary>
/// <returns></returns>
public override object Clone()
{
//对Clone方法 和 浅表副本实在不是了解 ,自己感觉是这
//个意思,也不知是不是大相径庭,还望路过的朋友指点
HashTableEx htEx = new HashTableEx();
lock (this)
{
foreach (DictionaryEntry dic in this)
{
htEx.Add(dic.Key, dic.Value);
}
return htEx;
}
}

}
}



为什么代码对齐不了呢? 



posted @ 2012-04-07 23:27  多夢的歲月  阅读(1049)  评论(0编辑  收藏  举报