【问题标题】:C# Reference Type alternatives to Value Types [closed]C# 引用类型替代值类型 [关闭]
【发布时间】:2021-09-14 17:29:21
【问题描述】:

我知道关于这个主题的问题有不同的帖子,但我找不到任何关于我的问题的来源。

在某些情况下,如果值类型表现为引用类型,会更容易,即可以在另一个方法中修改它们。 例如,我想跟踪 int 类型的一些值类型并将其中的几个传递给一个方法,该方法可能会修改它们。让我们假设,在执行该方法后,我需要在调用方使用更新的值。当然有多种方法可以实现这一点,但问题是将这些integers 传递给一个可以返回void 的方法会简单得多,但我们仍然可以获得那些integers 的更新值,因为我们持有引用。

据我所知,C# 中没有这样的包装器/类可以代表与值类型相同的体验,但仍是引用类型。 (例如int,包装器还是应该做++,--,范围相同等)

所以我的问题是为什么语言中没有这样的选择?我的假设是因为模棱两可,并且有一种直接的方式来做事。并摆脱比较两个不同类型的相等值等一些小麻烦。如果有人真的需要,他/她可以实现。

你对这个话题有什么看法?为什么语言不应该有这种值类型的包装器?

【问题讨论】:

  • 你的意思是通过ref吗? public void SomeFunction(ref int valueToModify)
  • ref out in 可以帮到你
  • 是的,您可以这样做,但您不能将这些修饰符与异步方法一起使用
  • 这能回答你的问题吗? ref and out arguments in async method
  • 您是否正在搜索与Tuple<T> 等效的mutable

标签: c# .net value-type reference-type language-specifications


【解决方案1】:

例如,我想跟踪一些 int 类型的值类型,并将其中的 几个 传递给一个方法,该方法可能会修改它们。

注意对“几个”的强调。这是创建对象的绝佳机会。所以不要这样:

UpdateValues(value, anotherVal, 12, someString, etc);

你会得到这个:

UpdateValues(valuesToUpdate);

您在该方法中设置的该对象上的任何属性确实会反映在该对象本身上。因为该对象只有一个实例。您不是在为变量设置值,而是在更新引用的属性。

基本上,不是传递裸值,而是编写有意义的对象并使用它们。这些对象可以填充您喜欢的所有业务逻辑,可以以您喜欢的任何方式进行修改,等等。


至于关于为什么一种语言具有或不具有您个人可能希望它具有的任何给定功能的辩论和意见......

我们可以花一整天的时间想出人为的例子,讨论是否需要它,是否会使代码更简单或更复杂,其他优点和缺点等等。但是有人曾研究过一种主要语言has already said it better。解释这个问题:

这是一个错误的问题。相反,问:“有没有令人信服的理由来实施和支持这个功能?”如果没有,则不需要考虑、争论、设计、指定、实施、测试、记录、交付给客户或与 C# 的每个未来功能兼容的规则来支持此功能。这可以节省大量成本。

【讨论】:

  • 首先,感谢您的精彩回答。对此,我真的非常感激。当然,如果您将多个参数传递给一个方法,那么您可能做错了什么。但有时这些争论彼此之间并不相关,尤其是在解决算法、问题时,更容易快速做事,无需定义模型。有时我只是希望该语言为该场景提供更方便的东西。但是你答案的最后一部分完美地回答了我的问题:这不值得。有更好的事情需要关注和交付。谢谢!
  • @DavidOganov: “有时参数之间并不相关” - 传递给同一个操作本身就是一种关系。即使您只是为了调用该方法而构建该对象,然后再次分解它,该对象也具有存在的语义和概念目的。 “快速做事更容易” - “快速”并不总是直接转化为“正确”或“更易于支持和维护”。许多程序员声称他们想做一些“保持简单”的事情,但从长远来看,他们最终会让事情变得更复杂。
  • 我 100% 同意。长期关注更为重要。不向前看很可能迟早会带来大问题。但我仍然很感兴趣微软的工程师是否考虑过类似的方法作为我的问题。因为他们最终开发了更多功能来克服这些问题。当然也有缺点。但似乎我开始转向辩论/意见:D
  • @DavidOganov:老实说,这可能是一个很大的问题,您可能会通过...设计一种语言来找到您问题的最佳答案。有多种用于学术或深奥目的的简单语言,抓住一种并根据您的想法对其进行修改可能会非常有趣。您可能会发现它不值得您花时间,在这种情况下,答案是有一些您不知道的原因,仅此而已。或者您可能会发现该功能导致的问题多于解决的问题。 或者您可能会发现它仅适用于特定的功能子集时效果非常好。
  • 我明白了...谢谢你,大卫。我真的很喜欢你的回答和交流。我真切地感受到你的每一句话所蕴含的经验和知识。感谢您抽出宝贵时间分享您的知识和经验。我真的很感激?
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
相关资源
最近更新 更多