2012-02-26 31 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导致参考文献通过参考,这几乎肯定不需要在这里