标签:style blog http color 使用 strong 数据 2014
分析问题
通过查看System.String类型的元数据可以看到,System.String是直接继承自System.Object的一个子类。在前面章节中笔者已经介绍了,所有直接或间接继承自System.ValueType的类型属于值类型,所以,System.String属于引用类型而非值类型。但是通常String的某些特性会让程序员产生其属于值类型的错觉。以下代码展示了这些特性。
using System; namespace Test { class StringAttribute { static void Main() { string a = "I am a string."; string b = a; Console.WriteLine(object.ReferenceEquals(a, b)); //尝试使用引用b修改a指向的对象 b = "I am a new string."; Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(object.ReferenceEquals(a, b)); Console.Read(); } } }
分析以上代码,程序开始申明了两个字符串引用,并且使它们指向了同一个字符串对象。调用object.ReferenceEquals方法可以验证这一点。下面的代码视图通过引用b来修改对象的内容:b="I am a new string.";而这一企图却失败了,分别查看a和b的对象发现它们指向了不同的对象实例,并且,调用object.ReferenceEquals方法发现两个引用确实不再指向同一个对象。下面是代码的执行结果
这样的执行结果很容易给人以错觉,误以为String属于值类型。事实上,这是因为字符串对象不可修改的特性所导致的。字符串对象一旦被初始化后,就不能再进行任何包括删除、切断、插入等改动,它是一个只读对象,而在以上代码中,b="I am a new string.";实际上初始化了一个新的字符串对象并且赋给了b的引用,这就解释了上面代码的执行结果。
由于字符串的只读特性,任何对字符串对象的修改都将强制生成一个新的字符串对象。理解这一点相当重要,读者在编写代码时,应该尽量避免过多无必要地生成字符串的中间变量对象,这在下面的章节中会有详细叙述。
答案
String是引用类型对象,它的对象在初始化后就不能再做修改,任何试图修改字符串的动作将导致一个新的字符串对象的生成。
System.String是值类型还是引用类型,布布扣,bubuko.com
标签:style blog http color 使用 strong 数据 2014
原文地址:http://www.cnblogs.com/wangjinpeng-study/p/3909123.html