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

本文关键字:参数 引用 | 更新日期: 2023-09-27 18:33:59

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

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

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

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

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

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

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

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

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

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

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

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

在 OOP 中,对结构与类的良好理解很重要,尤其是 c#