2012-02-26 32 views
0

是否可以通過引用傳遞HashSet函數?這是我目前的代碼。通過引用傳遞HashSet <string>參考

主要

this.scrapeFriends(startUsers, userIDs, 100); 

功能

private void scrapeFriends(StringCollection startUsers, ref HashSet<string> userIDs, int p) 
{ 
    // Do something 
} 

如果我刪除它的工作原理裁判。如果我添加它,它不會,也不會編譯。

+0

你試過嗎? – 2012-02-26 18:01:00

+5

你可能誤解'ref'。 – SLaks 2012-02-26 18:02:35

+1

您是否記得在從Main調用scrapeFriends方法時在userIds前面放入ref關鍵字? – Maate 2012-02-26 18:05:00

回答

5

你是總是通過引用傳遞HashSet<T>,因爲它是一個引用類型。

ref關鍵字在那裏爲您通過變量作爲參考。

基本上是:

  • 不管有沒有ref,你可以改變的HashSet<T>
  • 內容隨着ref關鍵字,您可以用不同例如更換HashSet<T>實例,並有主叫代碼注意到這一點(你正在修改傳遞給該方法的變量)
  • 沒有ref關鍵字,如果用另一個實例替換該實例,那個chang Ë只有在方法中效果被調用,調用它的代碼仍然有舊參考

代碼沒有編制的原因是,如果你犯了一個參數的方法ref參數,你必須與ref關鍵字調用它一樣,所以改變你的調用代碼如下:

this.scrapeFriends(startUsers, ref userIDs, 100); 
           ^^^ 
           | 
           +-- add this 
1

在有些情況下,你需要繞過一個可變的引用類型(如HashSet<T>)參照各地少數情況下。你確定這是其中之一嗎?特別是該方法可以在不使用ref的情況下向該組添加新項目。你只需要ref,如果你想改變它指向的第一個位置。在這裏你不太可能想要。

爲什麼你的代碼不能編譯的原因是,爲ref參數時,還需要指定ref在調用點:

this.scrapeFriends(startUsers, ref userIDs, 100); 

但正如我所說,這是不可能的,你想要這個。

2

爲了使這個編譯你需要爲調用

this.scrapeFriends(startUsers, ref userIDs, 100); 

不過,我要問你爲什麼這樣做是添加refHashSet<T>是.Net中的引用類型,因此它的副本不會傳遞給每個函數。每個函數都會引用相同的HashSet<T>實例(但通過引用的不同副本)。ref導致參考文獻通過參考,這幾乎肯定不需要在這裏