【问题标题】:Would a struct be a good choice for storing a group of values?struct 是存储一组值的好选择吗?
【发布时间】:2012-09-11 07:17:31
【问题描述】:

考虑以下 C# 类:

public class Person
{
    public string Name {get;set}
    public int Age {get;set}
}

我只会使用它在一个函数中使用单个参数传递几个变量 - 使用结构会是更好的方法吗?

编辑:我不在乎值是否改变,无论如何它们都不应该改变。

【问题讨论】:

    标签: c# class struct


    【解决方案1】:

    来自Eric Lippert的优秀"the stack is an implementation detail"底部:

    我总是根据类型是语义表示值还是语义对某物的引用来选择值类型还是引用类型。

    也就是说,两个Person 变量之间的相等性如何定义——如果它们包含相同的,或者它们是对单个实例的两个引用?

    【讨论】:

    • 那么,我应该选择一个结构,基于我只是将一些值组合在一起的事实?
    【解决方案2】:

    这取决于您对传入值后会发生什么的期望。 如果您不关心函数调用完成后保留的值的更改,则可以将其设为结构,但如果您希望使用 person 参数进行更改并且调用者应该看到它的函数,请使用类。

    另外,如果这是域模型/数据层的一部分,我会坚持使用一个类。

    【讨论】:

    • 复制我上次的评论:所以,我应该选择一个结构,基于我只是将一些值组合在一起的事实?
    • 也许吧。我看不出你不能使用结构的任何原因。当然,您可能还必须考虑身份。如果 Person 的两个实例具有相同的值,是否意味着它们是同一个人?
    • 在这种情况下不需要相等 - 我只是传递要使用 XML 转换的值:)
    • 如果你使用 ref 结构,你会看到变化,所以这不是选择的真正理由吗?
    【解决方案3】:

    这取决于您的要求。如果您不想继承并且不想在对象中进行任何修改(因为它的值类型),那么您可以继续使用 struct。

    否则类在所有方面都是最好的,尤其是在应用继承概念方面。

    可能与以下内容重复:Which is best for data store Struct/Classes?

    【讨论】:

      【解决方案4】:

      来自MSDN

      类是引用类型。当创建类的对象时,分配给该对象的变量只保存对该内存的引用。当对象引用分配给新变量时,新变量引用原始对象。通过一个变量所做的更改会反映在另一个变量中,因为它们都引用相同的数据。

      结构是一种值类型。创建结构时,分配给结构的变量保存结构的实际数据。当结构被分配给一个新变量时,它被复制。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。

      一般来说,类用于建模更复杂的行为,或在创建类对象后打算修改的数据。结构最适合主要包含在结构创建后不打算修改的数据的小型数据结构。

      【讨论】:

        【解决方案5】:

        我的经验法则;

        • 使用一个类直到你需要数百万并且需要一个结构来节省存储空间

        除其他外,使用结构会使这不起作用;

        • 列表[x].Name ="NewName";

        【讨论】:

        • 不,但是如果使用结构,var temp=List[x]; temp.Name="NewName"; List[x]=temp; 将起作用并产生预期的效果。如果使用可变类,List[x].Name="NewName"; 将编译并执行某些操作,但可能必须检查大量代码才能确定其全部效果(特别是对修改对象的其他引用存在)。跨度>
        • temp 方法有效,但很难看。并且显示的代码将编译,但不会按照您的预期执行。
        【解决方案6】:

        我倾向于使用带有公共字段(而不是属性)的简单结构。这种结构的美妙之处在于,除了字段的名称和类型之外,它们的行为都相同。给定结构Person 的数组MyPeople[] 和暴露字段Name,可以知道MyPeople[0].Name = "George";MyPeople[1].Name 没有影响。相比之下,如果Person 是其他相同的类,则不会有这样的保证。即使Person 是一个具有读写属性Name 的结构,如果不查看它的定义,人们也不会知道该属性实际上是否会像结构字段一样,或者它是否会访问存储在类对象。

        请注意,可能导致人们普遍偏爱属性而不是字段的原因不适用于简单的结构。如果一个对象Fred 拥有一个类类型的字段George,并且已经向外界公开了对其所引用的对象的引用,那么Fred 可以知道George 的属性不会'的唯一方法'如果George 类的代码不会在不让Fred 知道的情况下更改这些属性,则不会在其不知情或同意的情况下进行更改(在许多情况下,George 最简单的做法是简单地承诺它在任何情况下都不会让它的属性发生变化)。相比之下,如果Fred 拥有一个暴露字段结构类型的字段Ronald,那么在Fred 不知情和同意的情况下,Ronald 的任何字段都不会更改。由于除了 Fred 之外没有人可以操作这些字段,并且由于 Fred 会知道它对结构的要求,因此最简单的方法是让 Fred 负责维护任何所需的不变量。

        【讨论】:

          猜你喜欢
          • 2011-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-29
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          相关资源
          最近更新 更多