c# - 默认通过引用传递不可变值类型

标签 c# value-type

通常我在结构和类之间选择不是因为内存问题而是因为类型的语义。我的某些值类型具有相当大的内存占用,有时太大而无法一直复制此数据。所以我想知道总是通过引用传递 immutable 值对象是否是个好主意?由于对象是不可变的,因此它们不能被通过引用接受它们的方法修改。引用传递还有其他问题吗?

最佳答案

Some of my value types have quite large memory footprint

从实现的角度来看,这表明它们不应该是值类型。来自“开发类库的设计指南”,第 "Choosing Between Classes And Structures" 节:

Do not define a structure unless the type has all of the following characteristics:

  • It logically represents a single value, similar to primitive types (integer, double, and so on).
  • It has an instance size smaller than 16 bytes.
  • It is immutable.
  • It will not have to be boxed frequently.

听起来您应该改为创建不可变的引用 类型。在许多方面,它们最终“感觉”得像值对象(想想字符串),但您无需担心传递它们的效率。

值类型的“不变性”是一个稍微不稳定的概念 - 它肯定意味着使用 ref 是安全的:

// int is immutable, right?
int x = 5;
Foo(ref x);
Console.WriteLine(x); // Eek, prints 6...
...
void Foo(ref int y)
{
    y = 6;
}

我们不会更改该值的一部分 - 我们将 x 的整个值替换为一个完全不同的值。

当涉及到引用类型时,不可变性更容易考虑——尽管即使这样你也可以拥有一个本身不会改变但可以引用可变对象的对象...

关于c# - 默认通过引用传递不可变值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090904/

相关文章:

ios - 更新结构实例

c# - 如何从 Windows XP 下的程序中知道或更改 Windows 事件日志的大小?

c# - 无法让 Console.Writeline 重定向到 Visual Studio 窗口

c# - 如何创建具有初始大小的 Span<T>?

c# - 当函数中没有局部变量时,c# 中的 StackOverflowException

c# - 列表与数组中的索引器

c++ - 我怎样才能得到一个vector::value_type的sizeof?

c# - 如何将 ienumerable 集合附加到 C# 中的现有列表

c# - ClickOnce 开始菜单图标

c# - C# 中 "half"(binary16) 的类型是什么?