哪个最适合数据存储结构/类?

Ram*_*Vel 29 c# struct class

我们已经在SO中看到了很多关于c#中的类vs结构的讨论.最后得出的结论是它的堆/堆内存分配.并建议在小型数据结构中使用结构.

现在我有一种情况来决定这两种选择中的简单数据存储.在我们的应用程序中,我们有数千个类,只是作为简单的数据存储(仅暴露的公共字段),它们在不同的模块和服务之间传递.

根据我的理解,出于性能原因,我觉得最好继续使用struct而不是类.因为这些是简单的数据结构,所以只能充当数据存储.

在继续这一过程之前,我需要经历过这场斗争的人们的一些专家建议.

  • 我的理解是正确的吗?
  • 我见过大多数ORM都有类作为数据存储.所以我怀疑是否应该继续使用类而不是结构.会是什么?

Gis*_*shu 54

我会根据以下标准做出选择

  • 引用类型与值类型语义.如果两个对象只是相同,如果它们是同一个对象,则表示引用类型语义=> class.如果其成员的值定义相等(例如,如果两个DateTimes相等,如果它们都表示相同的时间点,即使它们是2个不同的对象),value type semantics => struct
  • 对象的内存占用.如果对象很大且频繁分配,那么使它成为一个结构会更快地消耗堆栈,因此我宁愿把它作为一个类.相反,我宁愿避免小值类型的GC惩罚; 因此使它们成为一个结构.
  • 你能让对象不可变吗?我发现结构非常适合"价值对象" - 来自DDD书籍.
  • 根据这个对象的用法,你会面临一些装箱拆箱的惩罚吗?如果是,请去上课.


Emm*_*RIN 14

Structs over Classes的一个非常酷的,不太知名的优点是在结构中有一个GetHashcode和Equals的自动实现.
当词典需要键时,这非常有用

GetHashcode和Equals的结构实现基于结构实例的二进制内容+引用成员的反射(如String成员和类的其他实例)

所以以下代码适用于GethashCode/Equals:

public struct Person
{
    public DateTime Birthday { get; set; }
    public int Age{ get; set; }
    public String Firstname { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Person p1 = new Person { Age = 44, Birthday = new DateTime(1971, 5, 24), Firstname = "Emmanuel" };
        Person p2 = new Person { Age = 44, Birthday = new DateTime(1971, 5, 24), Firstname = "Emmanuel" };
        Debug.Assert(p1.Equals(p2));
        Debug.Assert(p1.GetHashCode() == p2.GetHashCode());
    }
}
Run Code Online (Sandbox Code Playgroud)

当Person是结构时,两个断言都成功.如果Person是类而不是结构,则两个断言都会失败

参考:https: //msdn.microsoft.com/en-Us/library/2dts52z7%28v=vs.110%29.aspx

问候,最好的编码


thi*_*eek 7

结构应该定义为不可变的,而不应该在类中.如果您认为您的对象将变得小而且不可变,您可以继续制作它们的结构,或者让它们成为类.


Dar*_*mas 5

我似乎永远不会真正记住,结构是如何不同的,但它们是.以微妙的方式.事实上,有时他们会来咬你.

所以.除非你知道自己在做什么,否则只要坚持上课.

我知道这听起来有点新手.我知道我现在应该去查看差异并在这里显示它们 - 但这已经由其他人完成了.我所说的只是添加不同类型的对象会产生语义负担,一些额外的复杂性,您需要仔细考虑.

如果我没记错的话,最大的问题之一就是结构的值语义:传递它们会导致不同的对象(因为它们通过值传递).如果你在一个地方改变一些字段,请注意在所有其他地方该字段没有改变!这就是为什么每个人都建议结构的不变性!

编辑:对于你描述的情况,结构将不起作用!