关于结构:我应该使用结构而不是类来保存C#中的字符串数据吗?

Should I use a structure instead of a class to hold string only data in C#?

本问题已经有最佳答案,请猛点这里访问。

C问题。假设我有一个客户类,它有一系列只存储字符串数据的道具,比如姓名、邮政数据和电话号码。

我不将此实体用于ORM,因为我只是将其添加到某种类型的集合中,以便在应用程序生命周期中使用。此外,我不需要向它添加任何特定于实体的方法,也不需要将数据持久化到XML或数据库,甚至是Web服务。

将它设置为结构而不是类是否更好?还是没有好处?还有一个问题,我应该把收集客户列为一个列表结构吗?

严厉一点,请批评。:)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 struct customer
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

    }

struct Customers<List>
{
    private customer cust;

    public customer Cust
    {
        get { return cust; }
        set { cust = value; }
    }

}

我看不出任何使customer成为结构的价值。字符串字段都是引用类型,所以您也可以将整个对象设置为引用类型(即class)。

我倾向于使用一种内置的集合类型,而不是为Customers创建我的on类型。类似:

1
List<Customer> Customers = new List<Customer>();


我想你可以看看什么时候在C中使用struct?


除非您确定了使用结构的特定原因,否则请使用类。

更新:由于@dmitry lobanov:eric lippert的帖子:关于值类型的真相

Structs vs. Classes

Structs may seem similar to classes,
but there are important differences
that you should be aware of. First of
all, classes are reference types and
structs are value types. By using
structs, you can create objects that
behave like the built-in types and
enjoy their benefits as well.

Heap or Stack?

When you call the New operator on a class, it will be
allocated on the heap. However, when
you instantiate a struct, it can be
created on the stack. This will yield
performance gains. Also, you will not
be dealing with references to an
instance of a struct as you would with
classes. You will be working directly
with the struct instance. Because of
this, when passing a struct to a
method, it's passed by value instead
of as a reference.

裁判。


就其价值而言,我永远不会使用结构,因为我很少需要提供一个没有某种关联行为(验证器、格式化程序等)的仅数据结构。

关于"结构"的基本概念,我最喜欢的一点是它代表了一个最基本的存储系统,因此应该避免编写所有这些琐碎的自定义getter和setter以及所有这些东西…但是再一次,我们现在有了这些可爱的自动属性,它们从纯粹的编码角度有效地实现了相同的结果,虽然我中的Yagni Nazi可能会说使用这个结构是因为它是简单的,但我中的现实主义者知道无论如何我都不可避免地要将这个结构改为一个类,所以为什么不简单地实现从一开始就上课,把事情做完!;-)

至于性能和其他好处的争论…问你自己"这真的重要吗?"如果你在写一个严肃的实时系统…也许你想用另一个工具。如果你只是简单地传递一些数据,你可能会有大量的处理Crouton在你的处理,而且你的杀手算法可能不需要担心纳米秒的区别。


我个人在需要存储信息的任何地方都使用结构,只要它不会导致明显的性能问题。在大多数项目中,这是永远不会发生的,因为数据要么直接映射到现有类型,要么大于引用(影响不变的LINQ查询和其他操作)。我发现只有当我可以将数据粘贴到数组中并保留在数组中(直接修改数组中的变量)、很少使用结构或结构中的数据量小于64位(忽略结构开销)时,结构才可行。

正如我所解释的,结构应该只用于存储数据并将其从一种形式转换为另一种形式(ToString或ToArray转换器)。

此外,结构比具有主要差异的类更具限制性:

  • 结构是值类型,而类是引用类型。这意味着当分配整个结构实例时,只复制类实例的内存地址,而复制整个结构实例。由于大多数程序都是32位或64位的,因此通常建议限制结构的大小,以防止与复制结构实例相比的性能问题。虽然这可以通过将结构放入数组来克服,但这会将结构移动到堆(而不是堆栈)。此外,使用诸如List之类的泛型总是返回实例的副本,因为它们使用方法访问值。另请参见对象中的结构实例与类实例部分(C编程指南)
  • 结构可以在堆栈上实例化,而类总是在堆上实例化。这是由编译器控制的,不影响编码,尽管它可能有一个小的性能优势(很少被检测到)。
  • 在结构声明中,除非字段声明为const或static,否则无法初始化字段。
  • 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
  • 与类不同,结构可以在不使用新运算符的情况下实例化。
  • 结构不能从另一个结构或类继承,也不能是类的基。
  • 所有结构直接继承System.ValueType,后者继承System.Object,而类继承System.Object。
  • 结构不能为空(使用一般的可为空的结构)。