【问题标题】:Is using 'ref' or 'out' common practice in C# [closed]在 C# 中使用“ref”或“out”的常见做法 [关闭]
【发布时间】:2020-07-23 06:53:22
【问题描述】:

我在 Unity 上坚持了一段时间,对计算机科学/性能管理了解不多。

现在,我获得了一些 C++ 经验,对 IO/性能/等一些“计算机工程”的东西有些担忧。

然后我回到我的旧 Unity 项目,它根本不关心这些事情,并发现有 ref(或 out) 关键字用于按引用调用,就像我在我的 C++ 项目中所做的那样.

在“业务级别”上使用 C# 的 ref(用于通过引用调用的目的)是否常见?(也许是使用 Unity 的游戏公司?)

【问题讨论】:

  • stackoverflow.com/questions/20450888/using-ref-in-c-sharp 根据本页评论,不常见;哪个是对的?
  • 你知道值和引用类型的区别吗?您在 C# 中传递的大多数东西已经在底层传递了作为参考
  • 我猜你是怎么看的。每一个 C# 特性都是通用的并且被广泛使用。我想在这个阶段你可能应该对那些特定的语言特性做一些研究
  • Is it common to use ref .. 出于某种原因它存在 ;) 完全取决于用例 .. 请注意,所有类(引用)类型都是通过引用传递的,因此 ref 仅对结构(值类型)....

标签: c# unity3d pass-by-reference


【解决方案1】:

如果您来自 C++,那么您的脑海中就会有这样的想法,即您需要传递引用,因为如果您不这样做,整个对象将被复制并且很可能是 坏的 (tm).

在 C# 中,类型要么是引用类型,要么是值类型。引用类型通过引用自动传递。如果你传递一个类,它可以是null,所以它必须已经是实际类实例的引用(或者在C++术语中是一个“指针”,因为c++ 中的引用不能是null)。

所有类都是引用类型。出于性能原因,您永远不需要refout。如果您发现自己出于性能原因在struct 上使用refout,那应该是您应该使用class 的线索。

所以不,在 C# 中使用 refout 根本不是常见。它仅在没有它就无法获得所需结果的地方谨慎使用。这些关键字并非出于性能考虑。

【讨论】:

  • 我将它用于我无法访问的数值或结构,因此我无法将它们转换为类,例如
  • 结构的全部意义在于它是如此之小,以至于 复制它 比通过引用的间接引用要。如果这些结构来自您信任的来源,可以做出良好的软件决策,请在不使用 ref/out 的情况下使用它们。如果您不相信来源能够做出好的软件决策,请选择其他来源。
  • "引用类型通过引用自动传递。"实际上,这并不完全准确。根本不传递引用类型——传递的是引用本身,它是按值传递的。欲了解更多信息,read this.
  • 我可能已经理解了refout 的观点,但我认为它们不是关于性能或“必须复制整个结构”,而是更多关于能够改变/将变量的值设置为“超出”其原始范围。所以当然你可以有一个方法int AddOne(int value) => value + 1; 并像int i = 1; i = AddOne(i); 一样使用它。但是你也可以像void AddOne(ref int value) => value += 1; 那样做,并在更复杂的场景中像int i = 1; AddOne(ref i); 一样使用它,后者可能更具可读性。我非常喜欢outTryParseTryGet 的情况下。
  • @nvoigt 好的,我会接受这个解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2011-05-13
  • 2011-05-24
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多