0

看了一些文章还是一头雾水。为什么更改 StringBuilder 的值会更改而 DateTime 的值不会更改?据我了解,两者都是参考类型:

class Program
{
    static void Main(string[] args)
    {
        DateTime myDt = DateTime.MinValue;
        Change(myDt);
        Console.WriteLine(myDt);

        StringBuilder y = new StringBuilder();
        y.Append("hello");
        Foo(y);
        Console.WriteLine(y);

        String test = "hello";
        Foo(test);

    }

    public static void Change(DateTime dt)
    {
       dt.AddDays(24); 
       //or dt=dt.AddDays(24);
    }

    static void Foo(StringBuilder x)
    {
        x.Append(" world");
    }

    static void Foo(String x)
    {
        x = x + " world";
    }
}
4

5 回答 5

11

DateTime不是引用类型,它是一个结构,这意味着一个值类型。

于 2012-05-11T19:54:01.843 回答
5

DateTime是无法修改的值类型(结构)。它不是引用类型。

当您调用一个看似更改结构的方法时,它通常实际上返回一个全新的结构,而无需修改原始结构,因为无法修改原始结构(它是不可变的)。虽然这同样适用于字符串,但字符串不是值类型。它们是被设计为不可变的引用类型,因此需要诸如StringBuilder.

此外,将引用类型作为参数传递与使用ref或通过引用传递参数不同out

于 2012-05-11T19:54:41.920 回答
3

DateTime是一个结构,所以它是一个类型。

因此,与任何其他值类型一样,它按值过去(在实践中复制)并且仅在注入函数堆栈之后。

于 2012-05-11T19:55:35.303 回答
1

DateTime是一个结构 - 因此是一个值类型。字符串是不可变的引用类型。

于 2012-05-11T19:56:51.777 回答
0

正如其他人提到的那样,区别在于 Class ( StringBuilder 是)和 Struct ( DateTime 是)。这里有一些文章可以进一步帮助:

http://msdn.microsoft.com/en-us/library/ms173109.aspx

http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx

很好地理解结构和类在 OOP 中很重要,尤其是 c#

于 2012-05-11T19:58:05.603 回答