C#,struct vs class,更快?

AMH*_*AMH 16 c# struct class

可能重复:
哪个最适合数据存储结构/类?

考虑一个示例,其中我有一个Employee对象,其中包含年龄,姓名,性别,职称,薪水等属性.我现在有一个列表,我想填充一堆Employees(每个Employee实例是唯一的).

就速度和内存占用而言,将员工创建为Struct还是Class更为可取?

关于上述场景中Struct和Class的任何其他警告都是受欢迎的

Mar*_*ers 31

结构仅用于应具有类似行为的相对较小的结构.

除非类型具有以下所有特征,否则不要定义结构:

  • 它逻辑上表示单个值,类似于基本类型(整数,双精度等).
  • 它的实例大小小于16个字节.
  • 这是不可改变的.
  • 它不必经常装箱.

你的类型打破了前两个指南,也可能是第三个.所以你一定要在这里上课.

  • `它不必频繁装箱.这是什么意思? (4认同)
  • @alex参见https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxing基本上,这意味着将struct强制转换为将导致对其进行堆分配的类型。(广播结构体,该结构体是指针类型(如对象)或该结构体实现的任何接口的值) (4认同)

Mar*_*ell 12

它并不那么简单 - 您需要描述行为.例如,a struct会在您喜欢的时候自行复制,因此在某些方面它们会消耗更多内存.但是,作为原始数据转储的结构数组可以避免(非常小的)对象标题(以及额外的取消引用),因此可以提高效率.

然而,更大的问题在于你如何概念化它们; 员工不是价值 ; 如果我分配:

var emp = GetEmployee();
var tmp = emp;
Run Code Online (Sandbox Code Playgroud)

这是否意味着我现在应该有2名员工?它可能没有.现在如果我改变了:

tmp.Name = "Fred";
Run Code Online (Sandbox Code Playgroud)

这种影响是否emp取决于它是结构还是类.我打赌它应该在这里上课.我还建议结构应该几乎总是不可变的,以避免这种类型的数据丢失情况.有可变结构的情况,但它经常被错误地使用,我不想意外地鼓励你这样做.

结构封装会产生其他问题; 考虑一名员工有经理; 这可能吗?

[struct|class] Manager {
    private Manager boss;
}
Run Code Online (Sandbox Code Playgroud)

这只适用于一个班级.再次; 结构不太适合这种用法.也不是多态,抽象等