簡體   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