日期:2014-05-18  浏览次数:20849 次

请教一个关于stringbuilder的问题
今天在随手写Demo的时候发现的,以下是部分代码
C# code

    class Program
    {
        private static readonly StringBuilder outPutMessage = new StringBuilder();
        private static readonly string outPutString = string.Empty;
        static void Main()
        {
//不关心的内容
        }

        private static void AppendtoMessage(string message)
        {
            outPutMessage.Append("\n" + message);
            outPutString = outPutString + "\n" + message;
        }
    }




在代码中使用了两个readonly变量,一个是string,一个是StringBuilder 

在编译时,最后一句会报错,readonly的变量只能在构造函数和初始化时赋值,这个是意料之中的。

我的问题是为什么readonly的StringBuilder 却可以被Append?

在Main中调用多次都很正常,最后 tostring()也能生成字符串,这是为什么呢?这里的readonly还有什么意义呢?

谢谢!

------解决方案--------------------
因为readonly的是引用,而不是引用的对象。
如果你在Main这么写,是报错的:
outPutMessage = new StringBuilder();
------解决方案--------------------
C# code
using System;

namespace Test
{
    class Program
    {
        private readonly static MyString _MyString = new MyString();

        static void Main()
        {
            // 下面这行是错误的
            // _MyString = new MyString();

            _MyString.Append("1");
            _MyString.Append("2");
            _MyString.Append("3");

            Console.WriteLine(_MyString.Value);

            Console.ReadKey();
        }
    }

    class MyString
    {
        private String _value;
        public String Value
        {
            get { return _value; }
        }

        public MyString()
        {
            _value = String.Empty;
        }
        
        public void Append(String s)
        {
            _value = String.Format("{0}{1}", _value, s);
        }
    }
}