2010-12-12 102 views
1

我覺得這真的是一個非常蹩腳的問題,但我猜SO我將獲得答案的速度比通過谷歌搜索它自己:)C#對象修改

比方說,我有一些類構造函數:

public class TestClass { 

    private readonly IRepository repository; 

    public TestClass(IRepository repository) 
    { 
     this.repository = repository; 

     // Here is the non-obvious line - it invokes some 
     // method, which changes the internal contents of 
     // the repository object. 
     repository.AddSomething(...); 
    } 
} 

現在:

IRepository sqlRepository = new SqlRepository(...); 

TestClass testClass = new TestClass(sqlRepository); 

1)我在值/引用傳遞在C#並不好 - 所以請能有人給在這種情況下會發生什麼一步一步解釋。

2)是否sqlRepository對象得到修改(我假設沒有),是有辦法使TestClass構造修改(我知道這是邪惡的,只是我知道的)?

3)構造函數中的repository.AddSomething(...)this.repository.AddSomething(...)行具有相同的效果,爲什麼?

4)readonly對本示例中存儲庫更改的嘗試有什麼影響?

回答

2
  1. 在這種情況下,將對sqlRespository的引用傳遞給ctor。

  2. 還沒有。當您撥打AddSomething()時,該方法確實正在修改原始實例。我們仍然只有一個對象,每個人都觸摸那一個。這是一個重要的區別,因爲每個人都有一個參考同一個對象,他們所做的任何更改將使對該對象。但是,如果他們只是用另一個對象覆蓋該變量,那隻適用於本地。請記住,變量就像插槽一樣。我們可以有很多插槽指向同一個對象,但用一個指向不同對象的指針替換一個插槽不會影響其他插槽。

  3. 如果首次設置this.repository = repository然後都被稱爲repository和成員變量(場)的本地參數調用repository保持到同一對象的引用。我們使用this.來清楚我們是指成員變量(field)和而不是的本地參數或變量。

  4. readonly表示成員變量/字段只能從構造函數中分配。將成員變量想象成一個可以放置對象的插槽。如果插槽是readonly,那意味着它只能在ctor呼叫期間填充。之後,它不能被替換。那而不是意味着它裏面的對象是某種「只讀」的。該對象仍然可以被修改,它不能被另一個對象替換。