【问题标题】:ref keyword with reference type parameter [closed]带有引用类型参数的 ref 关键字 [关闭]
【发布时间】:2014-11-21 07:49:54
【问题描述】:

我认为更清楚的是,如果我将引用类型参数传递给方法,那将在方法内部更改以添加 像这样的 ref 关键字

void Foo(ref Boo boo)
{
    boo.Value = 6;
}

,即使这不会以任何方式影响程序执行,并且默认情况下对象是通过引用传递的,我不想更改 像这样在 void 内引用:

void Foo(ref Boo boo)
{
    boo = new Boo();
}

因为我认为使用 ref 从方法签名中可以清楚地看出我将更改内部的 Boo 而不是仅仅阅读它。 你同意吗?您对此有何看法?

【问题讨论】:

  • ref 必须在像 Foo(ref boo) 这样的 Foo 调用中显式使用,所以是的,这已经很明显对象将在函数中发生变化。
  • 你征求意见,所以应该关闭问题。但是,不,您认为它更清楚,但对我来说恰恰相反
  • 我认为使用 ref 关键字并没有真正增加任何价值。如果我们传入一个可变引用类型,则可以安全地假设它可能已发生变异。
  • @JameyD 实际上,这 并不 意味着“对象将被更改”。这意味着参数值是通过引用传递的,因此参数值可以改变。参数值不是对象,是never对象。参数值是对象的referenceref,在引用类型的上下文中,只是说:如果调用者将参数值重新分配给不同的引用:调用者将看到这种变化

标签: c# coding-style


【解决方案1】:

我认为更清楚的是,如果我将引用类型参数传递给方法,那将在方法内部更改为像这样添加 ref 关键字

不,这只是表明您不熟悉ref 的预期含义。方法来操作对它们可用的对象是完全正常和惯用的。如果您不希望这样:编写不可变对象

不要这样做。缺少ref 确实暗示任何类型的const

【讨论】:

  • 除了使对象不可变之外,不能在 C# 中强制执行纯度这一事实,并不能使它成为“惯用的”恕我直言。从某种意义上说,许多开发人员不将他们的“查询”和“操作”方法分开是正常的,因此您通常无法通过查看方法的签名来判断方法的作用。但这并不意味着这是一件好事。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2016-02-10
  • 2016-06-13
  • 1970-01-01
  • 2014-07-23
  • 2010-12-02
  • 2018-06-10
  • 1970-01-01
相关资源
最近更新 更多