首页 > 解决方案 > C# 引用类型替代值类型

问题描述

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

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

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

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

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

标签: c#.netvalue-typereference-typelanguage-specifications

解决方案


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

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

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

你会有这个:

UpdateValues(valuesToUpdate);

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

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


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

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

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


推荐阅读