首页 > 其他 > 详细

System.String是值类型还是引用类型

时间:2014-08-13 07:59:45      阅读:336      评论:0      收藏:0      [点我收藏+]

分析问题

  通过查看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方法发现两个引用确实不再指向同一个对象。下面是代码的执行结果

 bubuko.com,布布扣

   这样的执行结果很容易给人以错觉,误以为String属于值类型。事实上,这是因为字符串对象不可修改的特性所导致的。字符串对象一旦被初始化后,就不能再进行任何包括删除、切断、插入等改动,它是一个只读对象,而在以上代码中,b="I am a new string.";实际上初始化了一个新的字符串对象并且赋给了b的引用,这就解释了上面代码的执行结果。

  由于字符串的只读特性,任何对字符串对象的修改都将强制生成一个新的字符串对象。理解这一点相当重要,读者在编写代码时,应该尽量避免过多无必要地生成字符串的中间变量对象,这在下面的章节中会有详细叙述。

答案

  String是引用类型对象,它的对象在初始化后就不能再做修改,任何试图修改字符串的动作将导致一个新的字符串对象的生成。

 

System.String是值类型还是引用类型,布布扣,bubuko.com

System.String是值类型还是引用类型

原文:http://www.cnblogs.com/wangjinpeng-study/p/3909123.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!