2014-12-30 39 views
2

比方說,我們有一個程序,是這樣的:如何確定值是否被複制或引用?

namespace Example 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Storage MainStorage = new Storage(); 

      PrintData Printer = new PrintData(); 

      Printer.GetStorage(MainStorage); 
     } 
    } 

    class Storage 
    { 
     //Stores some data 
    } 

    class PrintData 
    { 
     Storage storage; 

     public void GetStorage(Storage storage) 
     { 
      this.storage = storage; 
     } 

     public void Print() 
     { 
      //Prints data 
     } 
    } 
} 

這只是一個例子,使代碼不會是完美的,但我的問題是,在這種情況下沒有的GetStorage()方法使MainStorage對象的副本或做它提到它呢?

+0

引用類型不會自動複製。 – Andrey

回答

3

它只是一個例子,使代碼不會是完美的,但我的問題是,在這種情況下沒有的GetStorage()方法使MainStorage對象的副本或它使對它的引用?

它製作了對Storage實例的引用的副本。在這種情況下,PrintData中的字段將引用內存中與您分配給MainStorage的實例相同的實例。

您可以通過檢查類型是class還是struct來檢查賦值是否具有引用語義。如果它是一個值類型(struct),則該副本將具有值複製語義。

+0

如果我決定修改'PrintData'中的'存儲'對象會發生什麼 –

+0

引用它的每個其他對象都會「看到」引用類型對象。這不會發生在結構上,因爲具體的副本被改變(糾正我,如果我錯了,但它不重新分配它?)。一個很好的例子就是網站是一個參考對象 - 你改變首頁,每個人都看到它更新。同時,影印紙是一種價值型物品 - 您可以編輯您的副本,但我的照片保持不變。 –

+0

裏德,你會說這個問題是http://stackoverflow.com/questions/1096449/c-sharp-string-reference-type的重複? –

0

在此示例中,它獲取引用的副本,而不是對象本身。

類總是通過引用複製。除非在方法參數中使用關鍵字ref,否則結構和枚舉按值複製。

字符串是類的一個特殊情況,它是不可變的(無法更改),無論何時修改引用指向表示結果的新對象的引用,它都是有效值的副本。

相關問題