C# 在修改作为参数传递的对象的内容时,是否应该使用ref

C# 在修改作为参数传递的对象的内容时,是否应该使用ref,c#,C#,假设我们有一个函数MutateX,它将变异一个可变对象x(在我的例子中是一个字节[]),它会毫不奇怪地改变x的状态。我可以用两种方式定义MutateX void MutateX (ref Object x); // (A) // or void MutateX (Object x); // (B) 无论如何,X是一个参考值-尽管两者都可以工作 对我来说,ref表示函数将以某种方式改变x(无论它是否改变其他对象的实际参考值)。是否有一种形式优于另一种形式 我注意到在SerialPor

假设我们有一个函数
MutateX
,它将变异一个可变对象
x
(在我的例子中是一个字节[]),它会毫不奇怪地改变
x
的状态。我可以用两种方式定义
MutateX

void MutateX (ref Object x);  // (A)
// or
void MutateX (Object x);      // (B)
无论如何,X是一个参考值-尽管两者都可以工作

对我来说,
ref
表示函数将以某种方式改变
x
(无论它是否改变其他对象的实际参考值)。是否有一种形式优于另一种形式


我注意到在SerialPort.Read中实现时没有

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


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

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


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

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

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

确实如此!但您并没有更改
x
-您正在更改为
x
引用的对象,这是另一回事

在以下情况下使用
ref

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

因此,简而言之,“否”。实际上,
ref
是非常少见的,而且理解不透彻,这是除非必要,否则尽量减少使用它的另一个原因。

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

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

确实如此!但您并没有更改
x
-您正在更改为
x
引用的对象,这是另一回事

在以下情况下使用
ref

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

因此,简而言之,“否”。实际上,
ref
是非常罕见的,而且人们对它的理解很差,这是除非必要,否则尽量减少使用它的另一个原因。

ref
只应在您更改参数本身时使用——在本例中,是x本身,而不是x的内容

代码是要被阅读和理解的。不要将关键字用于其他目的。你会把阅读你代码的其他人弄糊涂,这可能会在五年内把你也弄糊涂。这甚至不是偏好的问题,只是错了,错了,错了

你所寻找的实际上是 > const ——这在.NET中没有实现,部分原因是(因为每个C++程序员都可以告诉你)这是一个不完整的、棘手的动物。< /P> 如果您确实认为这很重要,您可以一致地使用您自己的命名法,并用项目规则记录它,例如

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

ref
仅当您更改参数本身时才应使用-在本例中,是x本身,而不是x的内容

代码是要被阅读和理解的。不要将关键字用于其他目的。你会把阅读你代码的其他人弄糊涂,这可能会在五年内把你也弄糊涂。这甚至不是偏好的问题,只是错了,错了,错了

你所寻找的实际上是 > const ——这在.NET中没有实现,部分原因是(因为每个C++程序员都可以告诉你)这是一个不完整的、棘手的动物。< /P> 如果您确实认为这很重要,您可以一致地使用您自己的命名法,并用项目规则记录它,例如

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

s/instantiate/reassign,但我同意。s/instantiate/reassign,但我同意。你是对的,我正在寻找const。我实际上在考虑是否有人链接到某种形式的讨论,以了解它为什么没有实现。我似乎记得在我第一次尝试查看是否以其他形式存在时看到过一个。Heijlsberg讨论了这里是他的:。我希望看到一个由编译器检查的(而不是像Heijlsberg所暗示的运行时)但作为一个主要的C++程序员,我知道它使语言的其他方面变得多么复杂,所以我接受它被排除在外。你是对的,我正在寻找const。我实际上在考虑是否有人与某种形式的讨论有联系,为什么它没有被实现。我似乎记得在我第一次尝试看时,看到一个。Hijjssg在这里讨论了这个问题:我很想看到一个编译器(而不是运行时,正如HijjssBigg所暗示的那样)——但是作为一个主要的C++程序员,我知道它使语言的其他方面变得多么复杂,所以我接受它被排除在外。