4

假设我有这样的课程:

public class ThingManager {
    List<SomeClass> ItemList;

    public void AddToList (SomeClass Item)
    {
        ItemList.Add(Item);
    }

    public void ProcessListItems()
    {
        // go through list one item at a time, get item from list,
        // modify item according to class' purpose
    }
}

假设“SomeClass”是一个相当大的类,其中包含非常复杂的方法和成员(例如 List<>s 和数组),并且可能有大量它们,所以不要在程序周围复制大量数据是重要的。

“AddToList”方法中是否应该有“ref”?为什么?

这就像试图重新学习 C 中的指针 ;-) (这可能是我感到困惑的原因,我试图将这些与指针联系起来。在 C 中它会是“SomeClass *Item”和“ SomeClass *" 变量)

4

4 回答 4

17

由于 SomeClass 是一个类,那么它会自动通过引用传递给 AddToList 方法(或者更准确地说,它的引用是通过值传递的),因此不会复制对象。如果要在 AddToList 方法中重新分配引用指向的对象,则只需要使用 ref 关键字,例如Item = new SomeClass();

于 2010-05-14T23:05:41.553 回答
2

由于 SomeClass 是引用类型,因此您不需要使用“ref”关键字。如果它是一个值类型,“ref”可能很有用。

于 2010-05-14T23:02:27.880 回答
1

out其视为使参数作为返回值工作的一种方式。

所以这些非常相似:

void Foo(out int result)
{
    result = 5;
}

int Foo()
{
    return 5;
}

然后将其ref视为允许参数既是输入又是输出的一种方式。

因此,在您的示例中,如果您声明了方法:

public void AddToList(ref SomeClass Item)

然后调用者必须编写如下内容:

SomeClass i = null;
obj.AddToList(ref i);

这将是非法的,例如:

obj.AddToList(ref new SomeClass());

他们将被迫传递一个变量名,而不是一个表达式,以便该AddToList方法可以在变量中存储一个值。通过添加ref前缀,您允许您的方法使传递的变量指向不同的对象。

于 2010-05-14T23:11:35.373 回答
0

如果您需要使用参数 user ref 的原始值。如果没有,请使用。以供参考:

http://www.yoda.arachsys.com/csharp/parameters.html

http://msdn.microsoft.com/en-us/library/0f66670z(VS.71).aspx

于 2010-05-14T23:01:46.000 回答