C#里面
1:
hashtable hs;
hs[key] = (object)"test";

2:
object a = hs[key];
a = (object)"test";
效果相同吗
3:
如果把 object a = hs[key]; 换成 string a = hs[key];呢
4:
如果把hashtable泛型化呢,或者说用泛型方式代替。
5:
如果是java里的 Map<?> 呢。
对于单纯的什么ref,单纯的一个i拿出来在各方法传递修改之后会变成什么。这个我都知道。很简单的 引用类型,值类型的区别,编码4年了,这些不算什么。
但把问题按上面那样一转,我突然又不明白了。 
如果1很简单,那么2呢,还是对引用的地址上的一个修改么?
那么3呢,当 string a = hs[key] 之后。 这个 a到底是指向 hs[key]的value的内存地址呢 还是说为a新开辟了一块内存?按我的理解:
1和2等效。
3不行,3等于为a新开辟了内存地址,不再指向那个value.   4,如果泛型化的话,我开始认为只有1才会达到修改value的初衷。但后来觉得,和hashtable一样的。
5,我最近在用java。 我觉得C#在这类的 语法逻辑上和JAVA没有本质区别。但是心里还是在打鼓,到底是不是这样?

解决方案 »

  1.   

    问题可真多,C#里面如果是class类型的,就不可能是值了,一定会出现装箱操作的。
      

  2.   

    hashtable hs;
    hs[key] = (object)"test";

    2:
    object a = hs[key];
    a = (object)"test";
    效果相同吗------
    不同.
    你这个题目可以看做有两个变量int a,hs;这俩变量都没初始化:
    你这里相当于是在问
    hs=10

    a = hs
    a = 10
    是否一样.泛型了还是一样,因为string是引用类型,
    引用说白了就是个指针,.net下是用于追踪托管堆对象的东西(叫啥来着?)
    在32位的机器上完全可以当做一个int或uint处理.
      

  3.   

    object a = hs[key];
    a = (object)"test";hs[key]在heap上,a指向ta
    (object)"test";  这个时候a有指向了"test"的装箱后的地址上,但是hs[key]还是在heap中的,带回会被GC掉
      

  4.   

    hashtable hs;
    hs[key] = (object)"test";
    hashtable 是class,没有new是不可以用的
    应该是 Hashtable hs = new Hashtable(); 这样你才可以操作hshs在stack上,有个指针指向在heap上的hashtable的实例(这里可以理解成指针或者引用)
    hs[key] = (object)"test";这个只是修改了hs[key]的值。