对C#中HashTable的Add方法参数类型的探讨

C#中提供了一种与ArrayList集合类型互补的一种集合类型,那就是HashTable(哈希表)类型,它也是一种集合类型。相信很多学过C#的人都知道如何去运用哈希表解决实际中的一些问题,当然,C#中仍有一些泛型集合类型可以用来代替哈希表,而且某些方面可以比哈希表有更高的效率。我的动机当然不是为了要贬低HashTable,而是就其中一些细节进行一些概念上的探讨。希望能对一些志同道合的人提供帮助。
HashTable类型有一个方法,用来向HashTable类型容器中添加元素(对象),这个方法就是Add方法。它是这样申明的:public void Add(Object key,Object value){....},粗略一看会觉得很容易理解,前一个参数是键值,后一个参数是所要存储的对象,这有什么好奇怪的。我要说的并不是参数本身,而是它们的类型。我们发现,两个参数前面都用的是Object来修饰的,这两个Object是表示同一个意思吗?答案是“不是”(本人观点)。
如果你之前已经了解了ArrayList集合类型,那么应该知道ArrayList中也有一个Add方法,它的定义是:public void Add(Object value){....},这里的Object表明所要存储的元素最终都要被转为Object类型,也就是要经过装箱。我们自然会联想到这里的Object和HashTable中Add方法的第二个参数前面类型Object应该是一样的,事实上也的确如此。但是key之前的Object是不是也包含着“将key转换成Object类型”的意思呢?我们不妨用以下一些简单的代码来验证一下。
我们先定义一个Teacher类:
public Class Teacher()
{
    //构造函数
    public Teacher(){}
    public Teacher(string name,int age)
    {
        this.Name = name;
        this.Age = age;   
    }
   
    //字段和属性
    private string name;
    public string Name
    {
        get{return name;}
        set{name=value;}
    }

    private int age;
    public int Age
    {
        get{return age;}
        set{age=value;}
    }
}
 
 调用Main函数:
    static void Main(string [] args)
    {
        //定义一个HashTable类型来存储Teacher   
        HashTable teachers = new HashTable();
        //创建4个教室对象,并将其添加到teachers中
        Teacher t1 = new Teacher("老师1",30);
        Teacher t2 = new Teacher("老师2",40);
        Teacher t3 = new Teacher("老师3",50);
        Teacher t4 = new Teacher("老师4",20);
        teachers.Add(t1.Name,t1);
        teachers.Add(t2.Name,t2);
        teachers.Add(t3.Name,t3);
        teachers.Add(t4.Name,t4);

        //我们来遍历一下该哈希表
        foreach(Object name in teachers.key)
        {
            Teacher t = (Teacher)teachers[name];
            Console.Write(t.name);
            Console.ReadLine();
        }
    }

运行以后,会输出:老师1老师2老师3老师4
如果将上面得foreach中的Object改为string我们一样可以得到以上结果,这表明teachers里面的键值并没有被转化为Object类型。
由此,我们可以得出public void Add(Object key ,Object value){....}中的前一个Object表示“key属于Object”,后面一个Object表示“value将转换为Object类”,key可以是任意类型,只要是Object的子类。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值