通过引用传递HashSet <string> </string>

时间:2012-02-26 18:00:25

标签: c#

是否可以通过引用函数传递HashSet?这是我目前的代码。

主要

this.scrapeFriends(startUsers, userIDs, 100);

功能

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

如果我删除它,它可以工作。如果我添加它,它不会,它将无法编译。

4 个答案:

答案 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的新实例并对其进行操作。