繁体   English   中英

C#通过引用混淆传递参数

[英]C# passing parameters by reference confusion

看了以后有些文章还是很困惑。 为什么更改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";
    }
}

DateTime不是引用类型,而是结构,表示值类型。

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

当您调用一个似乎会更改结构的方法时,它通常会真正返回一个全新的结构,而不修改原始结构,因为原始结构无法修改(它是不可变的)。 尽管对于字符串也是如此,但是字符串不是值类型;它不是值类型。 它们是被设计为不可变的引用类型,因此需要诸如StringBuilder类。

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

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

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

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

正如其他人提到的,区别在于类(StringBuilder是)和结构(日期时间是)。 以下是一些可以进一步帮助的文章:

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

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

在OOP中,尤其是C#,对结构与类的良好理解非常重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM