該值按值傳遞給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);
}
「結果會是」 - 不是很難嘗試自己!它是由引用btw ... –
除了你從來沒有說過,你的'myClass'是 - 一個參考或值類型 – horgh
我假設它是一個參考類型在這裏 –