C#,struct vs class,更快?

时间:2011-09-20 11:57:29

标签: c# class struct

  

可能重复:
  Which is best for data store Struct/Classes?

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

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

欢迎在上述场景中关于Struct vs Class的任何其他警告

3 个答案:

答案 0 :(得分:28)

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

  

除非类型具有以下所有内容,否则不要定义结构   特性

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

您的类型打破了前两个准则,也可能是第三个准则。所以你一定要在这里上课。

答案 1 :(得分:12)

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

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

var emp = GetEmployee();
var tmp = emp;

这是否意味着我现在应该拥有 2 员工?它可能没有。如果我改变了怎么办?

tmp.Name = "Fred";

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

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

[struct|class] Manager {
    private Manager boss;
}

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

答案 2 :(得分:3)

这取决于,在这种情况下,一个班级可能没问题。希望以下几点可以帮助你做出决定。

需要在以下条件下使用结构。

当您拥有小型数据结构时

数据结构不需要扩展功能。

当您想对数据结构执行更快的操作时。 (由于结构存储在堆栈上,对其执行的操作更快。)

需要在以下条件下使用课程。

当您有复杂的数据结构时

数据结构需要扩展功能。

当您想要优化内存使用时。 (由于类存储在堆上,当没有指向对象的引用时,它们将被垃圾收集。)

请查看here了解更多详情。