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