2013-02-03 65 views
-2

我對C++很有經驗,但對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); 

但這似乎不是有效的語法。

+3

「結果會是」 - 不是很難嘗試自己!它是由引用btw ... –

+1

除了你從來沒有說過,你的'myClass'是 - 一個參考或值類型 – horgh

+0

我假設它是一個參考類型在這裏 –

回答

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); 
} 
+0

謝謝,這正是我想要了解的。我應該更清楚地說明事情 - 我的榜樣是否不是我所追求的 - 你的回答就是我一直在尋找的東西。 –