在C#中通过引用或不引用传递对象

时间:2010-05-14 22:59:51

标签: c# pass-by-reference parameter-passing

假设我有这样一个类:

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”是一个相当大的类,包含非常复杂的方法和成员(例如,列表&lt;&gt;和数组),并且可能存在大量数据,因此不会复制大量数据该计划很重要。

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

这就像试图重新学习C中的指针一样;-)(这可能就是为什么我感到困惑,我试图将它们与指针联系起来。在C中它是“SomeClass * Item”和a “SomeClass *”变量列表)

4 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:2)

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

答案 2 :(得分: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前缀,您允许您的方法使传递的变量指向不同的对象。

答案 3 :(得分:0)

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

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

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