C#:一般来说,首选哪种数据容器?

Svi*_*ish 13 c# data-containers data-structures

在创建简单的数据容器类时,它应该是什么?

  • 类或结构?
  • 可变或不可变?
  • 有没有非空构造函数?

上述例子:

struct MutableStruct
{
    public string Text { get; set; }
    public int Number { get; set; }
}

struct ImmutableStruct
{
    public string Text { get; private set; }
    public int Number { get; private set; }
    public ImmutableStruct(string text, int number)
        : this()
    {
        Text = text;
        Number = number;
    }
}

struct MutableStructWithConstructor
{
    public string Text { get; set; }
    public int Number { get; set; }
    public MutableStructWithConstructor(string text, int number)
        : this()
    {
        Text = text;
        Number = number;
    }
}
class MutableClass
{
    public string Text { get; set; }
    public int Number { get; set; }
}

class ImmutableClass
{
    public string Text { get; private set; }
    public int Number { get; private set; }
    public ImmutableClass(string text, int number)
    {
        Text = text;
        Number = number;
    }
}

class MutableClassWithConstructor
{
    public string Text { get; set; }
    public int Number { get; set; }
    public MutableClassWithConstructor(string text, int number)
    {
        Text = text;
        Number = number;
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么好的理由我们应该选择另一个吗?或者主要是将主观偏好分开?或者它在很大程度上依赖于特定用例?如果是这样,在哪些用例中你应该选择什么和为什么?

Mar*_*ell 11

几乎总是一堂课; 结构应该只用于值的东西- 例如,复数或货币类型/值对 - 并且应该几乎不排除是不可变的.

如果要进行数据绑定,无参数构造函数对于可变数据很方便,因为这允许系统在没有自己的附加代码的情况下创建实例.非空构造函数对于不可变数据非常重要.对于可变数据,对象初始去实现这个很长的路要走(虽然不是十分的验证等方面相同):

var obj = new Person {Name="Fred", DateOfBirth=DateTime.Today};
Run Code Online (Sandbox Code Playgroud)

您的类型是否不可变取决于您; mutable使得更容易进行数据绑定和序列化.通常,您倾向于在.NET中看到更多可变类型,但随着我们进入并行/多核时代,这可能会发生变化.