前两天一个朋友问我,想实现一个轻量级的Dictionary<string,object>, 俺告诉他使用 System.Collections.Specialized.HybridDictionay, 它可以根据无素的数量自动选择内部的数据存储结构, 应该说是一个比较理想的选择, 后来又谈到, 如果在里面存储 <string,string>会不会引发装拆箱操作,因为string是值类型的, string在.net中是一个比较特殊的类型,它表现出来是值类型,但是准确的讲它应该是"内置的引用类型", 因此对于上面的操作不会引发装拆箱的操作. 为了验证这个说法写了一段程序: 反汇编结果如下:
 1C#中的String类型.method private hidebysig static void  Main(string[] args) cil managed
 2 end of method Program::Main
源程序:

C#中的String类型        static void Main(string[] args)
        }

注意到在反编出来的代码中的23行执行了装箱操作,但是对于后面的字符串转为Object确没有进行box.

另外, 由于一个字串在.net中一旦被创建出来就不可更改,可以认为CLR在内存维护了一个字符串的字典, 对于字符串的更改会在这个字典中查找是否已经存在,否则就再创建一新的字串. 因此于对这样的操作:  Console.Write(str1 + str2)最好写成 Console.Write(str1),  Console.Write(str2), 否则将产生一个新的字串.

相关文章: