【问题标题】:Why do I sometimes have to pass a class by reference and other times not?为什么有时我必须通过引用传递一个类,而其他时候则不需要?
【发布时间】:2011-10-31 09:41:06
【问题描述】:
我有一个将List<Foobar> 和Foobar 作为参数的方法。 Foobar 是一个常规类,具有私有变量、构造函数和对数据进行操作的方法。
我修改了方法中传递的两个实例,但由于某种原因,我必须使用 ref 关键字传递 Foobar,否则当方法完成时更改不会生效。我不必为列表执行此操作。
我最近在编程中多次注意到这一点。通常在将类的实例传递给方法时,修改它会更改实例,但有时不会,它需要ref 关键字才能使更改生效。它在工作时似乎相当随机。有谁知道这是为什么?
【问题讨论】:
标签:
c#
winforms
reference
pass-by-reference
【解决方案1】:
如果一个参数的值发生变化,像这样:
parameter = new SomeValue();
那么该更改将仅被使用ref的调用者看到。
如果您要更改调用者传递引用的对象 的内容,则可以按值传递该引用:
public void AppendHello(StringBuilder builder)
{
// This changes the data within the StringBuilder object that the
// builder variable refers to. It does *not* change the value of the
// builder variable itself.
builder.Append("Hello");
}
请查看我的article on parameter passing 了解更多信息。
请注意,如果参数类型是结构而不是类,那么您不会将引用的副本传递给对象 - 您将传递实际数据本身。在这种情况下,您还需要使用ref。
【解决方案2】:
“修改它”是什么意思。您可以通过更改属性或将元素添加到通用列表来将对象传递给方法并更改其数据。但是,您不能更改该变量指向的实际对象。为了真正改变,说 Foobar 完全是别的东西,它需要通过 ref 传递。