C#通过参考混淆传递参数

时间:2012-05-11 19:52:53

标签: c# oop

看完一些文章后仍然困惑。为什么更改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";
    }
}

5 个答案:

答案 0 :(得分:11)

DateTime不是引用类型,它是一种结构,表示值类型。

答案 1 :(得分:5)

DateTime是一个无法修改的值类型(结构)。它不是参考类型。

当你调用一个似乎改变结构的方法时,它通常会返回一个全新的结构,而不修改原始结构,因为原始版本不能修改(它是不可变的)。虽然这同样适用于字符串,但字符串不是值类型;它们是被设计为不可变的引用类型,因此需要StringBuilder等类。

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

答案 2 :(得分:3)

DateTime是一种结构,因此它是类型。

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

答案 3 :(得分:1)

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

答案 4 :(得分: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#