値は値によって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);
}