假设我们有一个函数MutateX
,它将改变一个可变对象x
(在我的例子中是一个byte []),这不足为奇地改变了x
'国家。我可以用两种方式定义MutateX
void MutateX (ref Object x); // (A)
// or
void MutateX (Object x); // (B)
无论如何,X都是一个参考值 - 虽然可以工作。
对我ref
表示该函数将以某种方式更改x
(无论它是否将实际参考值更改为其他某个对象)。是否有一种形式优先于另一种形式?
我注意到在SerialPort.Read中没有
答案 0 :(得分:5)
如果您只是更改对象的状态(即不重新分配引用,但设置属性/调用方法/等),则不:不要使用ref
。
对我来说ref表示该函数将以某种方式改变x
确实如此!但是不是正在更改x
- 您正在通过x
更改为对象引用,这是另一回事。
使用ref
if:
总之; “没有”。实际上,ref
非常罕见且很难理解,除非必要,否则另一个理由可以最大限度地减少使用它。
答案 1 :(得分:3)
ref
- 在本例中为x本身,而不是x的内容。
要阅读和理解代码。,请勿将关键字用于其他目的。你会把阅读你代码的其他人混淆 - 这可能包括你在五年内。它甚至不是偏好的情况,它只是错误,错误,错误。
你正在寻找的是const
- 这在.NET中没有实现,部分原因是(正如每个C ++程序员都可以告诉你的那样)它是一个不完整和棘手的野兽。
如果您认为这很重要,您可以一致地使用自己的术语,并将其记录在项目规则中,例如
void UseX(Object constX) { ... }
void MutateX(Object x) { ... }
答案 2 :(得分:1)
否 - 如果您只需要修改传递的对象的属性或内容,则不需要ref。无论如何,类的对象实例作为引用传递 - 您可以在代码中完全更改它。
当你想要在方法中实际实例化对象时需要引用 - 在这种情况下,你不是修改传入的对象的属性,你实际上是在修改对象本身(它的实例,通过创建它) )。