假设我有这样一个类:
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 *”变量列表)
答案 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