在修改作为参数传递的对象的内容时,我应该使用ref吗?

时间:2009-11-27 06:25:55

标签: c#

假设我们有一个函数MutateX,它将改变一个可变对象x (在我的例子中是一个byte []),这不足为奇地改变了x'国家。我可以用两种方式定义MutateX

void MutateX (ref Object x);  // (A)
// or
void MutateX (Object x);      // (B)

无论如何,X都是一个参考值 - 虽然可以工作。

对我ref表示该函数将以某种方式更改x(无论它是否将实际参考值更改为其他某个对象)。是否有一种形式优先于另一种形式?

我注意到在SerialPort.Read中没有

3 个答案:

答案 0 :(得分:5)

如果您只是更改对象状态(即不重新分配引用,但设置属性/调用方法/等),则不:不要使用ref

  

对我来说ref表示该函数将以某种方式改变x

确实如此!但是不是正在更改x - 您正在通过x更改为对象引用,这是另一回事。

使用ref if:

  • 更改引用本身(对于引用类型)
  • 更改值类型的状态(yuck,应该是不可变的,或者使用方法的返回值,这可能更简单)

总之; “没有”。实际上,ref非常罕见且很难理解,除非必要,否则另一个理由可以最大限度地减少使用它。

答案 1 :(得分:3)

只有在更改参数本身时才应使用

ref - 在本例中为x本身,而不是x的内容。

要阅读和理解代码。,请勿将关键字用于其他目的。你会把阅读你代码的其他人混淆 - 这可能包括你在五年内。它甚至不是偏好的情况,它只是错误,错误,错误。

你正在寻找的是const - 这在.NET中没有实现,部分原因是(正如每个C ++程序员都可以告诉你的那样)它是一个不完整和棘手的野兽。

如果您认为这很重要,您可以一致地使用自己的术语,并将其记录在项目规则中,例如

void UseX(Object constX) { ... }
void MutateX(Object x)  { ... }

答案 2 :(得分:1)

否 - 如果您只需要修改传递的对象的属性或内容,则不需要ref。无论如何,类的对象实例作为引用传递 - 您可以在代码中完全更改它。

当你想要在方法中实际实例化对象时需要引用 - 在这种情况下,你不是修改传入的对象的属性,你实际上是在修改对象本身(它的实例,通过创建它) )。