-2

私は C++ の経験はありますが、C# は初めてです。

オブジェクトをコンテナに追加するとき、オブジェクトは参照渡しですか、それとも値渡しですか?

つまり、これを行うと:

myClass m = new myClass(0);       //Assume the class just holds an int
List<myClass> myList = new List<myClass>(1);
myList.Add(m);
myList[0] += 1;
Console.WriteLine(m);
Console.WriteLine(myList[0]);

結果は次のようになります。

0
1

それともそうなるでしょうか

1
1

?

前者の場合、どうすれば後者を実行させることができますか? 私の最初の本能は、次のようなことをすることでした

myClass ref mref = m; 
Console.WriteLine(mref);

しかし、これは有効な構文ではないようです。

4

1 に答える 1

6

値は値によってAddメソッドに渡されます。ただし、参照型 (クラスは常に参照型) を渡すと、値自体が参照になります。したがって、問題は、値が値渡しか参照渡しかということではなく、型が値型か参照型かということです。

class MyClass
{
    public int Number { get; set; }
}

この宣言により、次のようになります。

MyClass m = new MyClass();
List<MyClass> myList = new List<MyClass>();
myList.Add(m);

myList[0].Number += 1;
Console.WriteLine(myList[0].Number); // Displays 1
Console.WriteLine(m.Number); // Displays 1

myList[0].Number += 1;
Console.WriteLine(myList[0].Number); // Displays 2
Console.WriteLine(m.Number); // Displays 2

structによって返される値myList[0]はリストに格納されている値のコピーになるため、これは では機能しないことに注意してください。は、この一時コピー+= 1のプロパティをインクリメントするだけなNumberので、数プロセッサ サイクルを消費する以外の効果はありません。したがって、不変の構造体のみを作成することをお勧めします。


オブジェクトを直接表示したい場合は、オーバーライドしますToString

class MyClass
{
    public int Number { get; set; }

    public override string ToString()
    {
        return Number.ToString();
    }
}

今、あなたは書くことができます

myList[0].Number += 1;
Console.WriteLine(myList[0]);
Console.WriteLine(m);

myList[0] += 1演算子のオーバーロードを使用することもできます。MyClass宣言中

public static MyClass operator +(MyClass m, int i) 
{
    m.Number += i;
    return m;
}

ただし、クラスが数値を表さない限り、これは少し奇妙ですが、その場合、struct数値は一般に不変の値型として認識されるため、不変が優先されます。

public static MyStruct operator +(MyStruct m, int i) 
{
    return new MyStruct(m.Number + i);
}
于 2013-02-03T05:08:50.973 に答える