2016-08-10 25 views
-4

我有一些服務的構造函數:收集更新時Refs是否在構造函數中使用?

public Ctor(List<Items> items) 
{ 
    _items = items; 
} 

public void Work() 
{ 
    if(_items.Count() > 5) 
    //do some work 
} 

Work方法會被時間稱爲時間。 因此,如果在對象外面我更改items - 會發生什麼? 將_items.Count()更改?

因爲在這個最新版本我用這個:

public void Work() 
{ 
    if(StaticClass.Items.Count() > 5) 
    //do some work 
} 

StaticClass.Items更新時,外面的項目集合改變。 所以,如果我有這樣的:

var service = new Constructor(StaticClass.Items); 

然後我更新StaticClass.Items元素 -

我可以用實際_items.Count()值時Work方法調用(通過一些定時器)或我應該使用ref關鍵字?

+6

試試看並找出答案。你已經編寫了代碼。看看你運行它會發生什麼。 – Servy

+2

如果您不知道_precisely_爲什麼通過'ref'傳遞某些東西,那麼您可能不需要它。這是一個非常罕見的情況,需要它。 –

+1

我不清楚你在問什麼。如果集合中的項目數量發生變化,那麼對該集合調用'.Count()'的結果也會改變。 '.Count()'返回當前的項目數量。這個問題究竟是什麼? – David

回答

5

當你像你的例子一樣通過構造函數傳遞一個集合時,你實際上傳遞了列表的引用。 ref關鍵字在大多數情況下爲struct和值類型參數。

這樣做:

public myClass(IEnumerable<MyOtherClass> pMyItems) 
{ 
    _items = pMyItems; 
} 

將是相同的

public myClass(ref IEnumerable<MyOtherClass> pMyItems) 
{ 
    _items = pMyItems; 
} 

因爲IEnumerable的或列表,你的情況,通常是引用類型。

因此,要回答你的問題:你是否使用ref或沒有,在你的情況,修改實例化對象之外的收集將修改集合中的實例化對象:是相同的實例,在這兩個地方引用。

下面是關於C#中ref關鍵字的MSDN entry的更多信息。

+1

閱讀答案後,我明白了這個問題。 – Sinatr

相關問題