在C#中,何时引用类型比值类型更有效?

时间:2009-09-03 21:29:23

标签: c# performance types

参考类型是否有时间比值类型更有效?为什么?你能给我举个例子吗 ?

5 个答案:

答案 0 :(得分:10)

任何时候你都会在很多物体之间传递它。

每次调用带有值类型的方法,或每次调用到另一个位置时,都需要值类型成员的完整副本。如果您有相当多的成员,这可能会导致性能的巨大损失。

例如,假设您有一个具有20个int值的对象:

public class MyClass { int a; int b; int c; ... }
public class MyStruct { int a; int b; int c; ... }

如果我们这样做:

MyClass class = new MyClass();
MyClass struct = new MyStruct();

this.CallSomeMethod(class); // Just copies one IntPtr reference!
this.CallSomeMethod(struct); // Needs to copy a large amount of data to run - 20x the other on x86, 10x on x64, since it's 20 Int32 values!

答案 1 :(得分:4)

这个问题太宽泛,无法得到明确的答案。一个示例案例可以是您拥有10k对象并将其传递给递归函数的情况。如果您使用值类型,则每次调用方法时,您都将复制整个事物。

答案 2 :(得分:0)

可以在没有额外级别的间接的情况下访问值类型成员。一般来说,参考类型是一个很好的凝视点。您应该对应用程序进行概要分析,如果通过引用成员而遇到严重的性能问题,则可以尝试使用值类型(如果它适用于设计)。

对于非常小的结构,您可能更喜欢没有分析的值类型。特别是如果你的strct只包含四个字节值或类似的东西。在64位平台上,每个引用(间接)都需要8字节的内存。请记住,即将推出的x64 Windows版本可以在CPU寄存器中存储8个字节。如果您的结构小到8字节,则可以将其保存到寄存器中。

正如已发布的那样,请记住,值必须完全按值调用复制。如果结构大于8字节,则可能会对性能产生巨大影响。

答案 3 :(得分:0)

如果效率高,则表示对CPU的指令较少:

  1. 值类型具有初始化默认值的默认构造函数,而引用类型默认为空引用。

  2. 更改一个值类型的值不会影响另一个值类型 引用类型的值可能会更改其他引用类型的值。

答案 4 :(得分:0)

我尝试更多地考虑语义而不是性能,除非我描述那里确实存在问题。因此,如果我想要一些行为类似值并且具有值语义的东西,那么我使用一个结构,否则我使用一个类。

我相信大多数代码都可以正常工作,就像你的对象很复杂,性能成为一个问题,你可能不想要价值语义。