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 に答える