可能重复的问题:
哪种数据存储方式最好:Struct或Classes?
假设我有一个Employee对象,具有像年龄、姓名、性别、职称和薪资等属性。现在我有一个列表,想用一些Employee来填充它(每个Employee实例都是唯一的)。
就速度和内存占用而言,在上述场景中创建Employee时,使用Struct还是Class更可取?
欢迎提供有关上述场景中Struct和Class的任何其他注意事项。
可能重复的问题:
哪种数据存储方式最好:Struct或Classes?
假设我有一个Employee对象,具有像年龄、姓名、性别、职称和薪资等属性。现在我有一个列表,想用一些Employee来填充它(每个Employee实例都是唯一的)。
就速度和内存占用而言,在上述场景中创建Employee时,使用Struct还是Class更可取?
欢迎提供有关上述场景中Struct和Class的任何其他注意事项。
结构体仅适用于应具有类似值类型行为的相对较小的结构。
除非该类型具备以下所有特征,否则不要定义结构体:
- 它在逻辑上代表单个值,类似于原始类型(整数、双精度等)。
- 它的实例大小小于16字节。
- 它是不可变的。
- 它不需要经常装箱。
您的类型违反了前两个指南,可能也违反了第三个指南。因此,在此处绝对应使用类。
这并不是那么简单-你需要描述行为。例如,一个结构体可以随时复制自己,因此在某些方面它们可能会消耗更多的内存。但是,作为原始数据转储的结构体数组可以避免(非常小的)对象头(和额外的解引用),因此可以提高效率。
然而,一个更大的问题在于你如何概念化它们;雇员不是一个值;如果我赋值:
var emp = GetEmployee();
var tmp = emp;
这是否意味着我现在应该有2名员工?很可能不是这样。那如果我改变:
tmp.Name = "Fred";
这是否会影响emp
取决于它是结构体还是类。我认为这里应该是类。我还建议一个结构体应该几乎总是 是不可变的,以避免这种数据丢失的情况。虽然有可变结构体的情况,但由于经常被错误使用,我不想无意中鼓励你这样做。
结构体的封装也存在其他问题;考虑员工是否有经理;这是可能的吗?
[struct|class] Manager {
private Manager boss;
}
这仅适用于类。再次强调:结构体不太适合这种类型的用法。也不适用于多态、抽象等。
ArrayOfRect [3] .Width = 34;
)几乎总是一个非常糟糕的想法,并导致出现微妙问题的情况。关于最后一个问题...呃,与您的示例完全相同,只是使用类,这样做并不是一件坏事。 - Marc Gravell