通常我在结构和类之间选择不是因为内存问题而是因为类型的语义。我的某些值类型具有相当大的内存占用,有时太大而无法一直复制此数据。所以我想知道总是通过引用传递 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/