是否可以通过引用函数传递HashSet?这是我目前的代码。
主要
this.scrapeFriends(startUsers, userIDs, 100);
功能
private void scrapeFriends(StringCollection startUsers, ref HashSet<string> userIDs, int p)
{
// Do something
}
如果我删除它,它可以工作。如果我添加它,它不会,它将无法编译。
答案 0 :(得分:5)
您始终通过引用传递HashSet<T>
,因为它是引用类型。
ref
关键字可供您通过引用传递变量。
基本上:
ref
,您可以更改HashSet<T>
ref
关键字,您可以将HashSet<T>
实例替换为不同的实例,并让调用代码知道这一点(您正在修改变量)传递给方法)ref
关键字,如果用不同的实例替换实例,那个更改只会在被调用的方法中生效,调用它的代码仍然具有旧的引用代码未编译的原因是,如果您为方法ref
参数创建参数,则必须使用ref
关键字调用它,因此请将您的调用代码更改为这样:
this.scrapeFriends(startUsers, ref userIDs, 100);
^^^
|
+-- add this
答案 1 :(得分:2)
为了进行此编译,您需要在呼叫站点添加ref
this.scrapeFriends(startUsers, ref userIDs, 100);
但是我想问你为什么要这样做? HashSet<T>
是.Net中的引用类型,因此它的副本不会传递给每个函数。每个函数都将引用相同的HashSet<T>
实例(但通过引用的不同副本)。 ref
导致引用通过引用传递,这几乎肯定不需要
答案 2 :(得分:1)
在某些情况下,您需要通过引用传递可变引用类型(例如HashSet<T>
)。你确定这是其中之一吗?特别地,该方法可以在不使用ref
的情况下向集合添加新项目。如果您想要更改首先指向的集合,则只需ref
。你不太可能想要这个。
您的代码无法编译的原因是,对于ref
参数,您还需要在呼叫站点指定ref
:
this.scrapeFriends(startUsers, ref userIDs, 100);
但正如我所说,你不太可能想要这个。
答案 3 :(得分:0)
如其他答案中所述,为确保代码能够编译,您需要在调用站点上添加ref
,如下所示。
this.scrapeFriends(startUsers, ref userIDs, 100);
要提供更多上下文,HashSet是C#中的引用类型。当您将其传递给方法 without ref 时,将传递存储HashSet的内存位置的地址。这样一来,您只能从HashSet中添加/删除元素。
但是,当您在调用方法时使用ref
时,将传递变量存储位置的内存地址。这样,您就可以将变量指向新的位置,即创建HashSet的新实例并对其进行操作。