考虑以下 C# 类:
public class Person
{
public string Name {get;set}
public int Age {get;set}
}
我只会使用它来传递具有单个参数的函数中的几个变量 - 使用结构会是更好的方法吗?
编辑:我不在乎值是否改变,无论如何它们都不应该改变。
从 Eric Lippert 优秀的“堆栈是一个实现细节”的底部:
我总是根据类型在语义上表示值还是在语义上对某物的引用来选择值类型与引用类型。
也就是说,如何在两个Person
变量之间定义相等 - 如果它们包含相同的值,或者它们是对单个实例的两个引用?
这取决于您的要求。如果您不想继承并且不想在对象中进行任何修改(因为它的值类型),那么您可以继续使用 struct.
否则类在所有方面都是最好的,尤其是应用继承概念。
这可能是重复的:哪个最适合数据存储结构/类?
这取决于您对传入值后应该发生什么的期望。如果您不关心函数调用完成后保留的值的更改,则可以将其设为结构,但如果您希望使用 person 参数进行更改并且调用者应该看到它的函数,请使用班级 。
此外,如果这是域模型/数据层的一部分,我会坚持使用一个类。
来自MSDN:
类是引用类型。当创建类的对象时,分配给该对象的变量只保存对该内存的引用。当对象引用分配给新变量时,新变量引用原始对象。通过一个变量所做的更改会反映在另一个变量中,因为它们都引用相同的数据。
结构是一种值类型。创建结构时,分配给结构的变量保存结构的实际数据。当结构被分配给一个新变量时,它被复制。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。
通常,类用于建模更复杂的行为,或在创建类对象后要修改的数据。结构最适合主要包含在创建结构后不打算修改的数据的小型数据结构。
我的经验法则;
其中,使用结构会使这不起作用;
我的倾向是使用带有公共字段(而不是属性)的简单结构。这种结构的美妙之处在于,除了字段的名称和类型之外,它们的行为都相同。给定一个带有暴露字段MyPeople[]
的结构数组,可以知道它不会对. 相比之下,如果是一个其他相同的类,则不会有这样的保证。即使是具有读写属性的结构,如果不查看其定义,人们也不会知道该属性实际上是否会像结构字段一样运行,或者它是否会访问存储在类对象中的内容。Person
Name
MyPeople[0].Name = "George";
MyPeople[1].Name
Person
Person
Name
请注意,可能导致人们普遍偏爱属性而不是字段的原因不适用于简单的结构。如果一个对象Fred
拥有一个George
类类型的字段,并且已经向外部世界公开了一个对其所引用的对象的引用,那么唯一Fred
可以知道George
的属性在其不知情或同意的情况下不会改变的唯一方法是类George
不会让这些属性改变,至少不让Fred
知道(在许多情况下,最简单的方法George
是简单地承诺它不会让其属性在任何情况下改变)。相比之下,如果Fred
持有一个Ronald
暴露字段结构类型的字段,那么任何Ronald
' 字段都不会改变Fred
的知情和同意。由于没有人Fred
可以操纵这些字段,并且由于Fred
知道它对结构的要求,因此最简单的方法就是让Fred
负责维护任何所需的不变量。