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

我应该使用结构而不是类来保存C#中的纯字符串数据吗?,c#,struct,C#,Struct,问题。 假设我有一个customers类,它有一堆用于存储字符串数据的道具,例如姓名、邮政数据和电话号码 我不会将此实体用于ORM,因为我只是将其添加到某些类型的集合中,以便在应用程序生命周期中使用。 此外,我不需要向其中添加任何特定于实体的方法,也不需要将数据持久化到xml或数据库,甚至不需要将数据持久化到Web服务 让它成为一个结构而不是一个类更好吗?还是没有好处? 还有一个附带问题,我是否应该将收集的客户设置为列表结构 严厉一点,请批评……) struct客户 { 私有字符串名称; 公共字

问题。
假设我有一个customers类,它有一堆用于存储字符串数据的道具,例如姓名、邮政数据和电话号码

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

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

严厉一点,请批评……)

struct客户
{
私有字符串名称;
公共字符串名
{
获取{返回名称;}
设置{name=value;}
}
}
结构客户
{
私人客户;
公共客户
{
获取{return cust;}
设置{cust=value;}
}
}

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

更新:由于@Dmitry Lobanov:Eric Lippert的帖子:

结构与类的对比

结构可能类似于类, 但也有重要的区别 你应该知道的。第一 所有,类都是引用类型和 结构是值类型。利用 结构,您可以创建 与内置类型和 享受他们的好处

堆还是堆栈?

在类上调用新运算符时,它将 在堆上分配。但是,什么时候? 如果实例化一个结构,它可以是 在堆栈上创建。这将产生 业绩增长。而且,你不会 正在处理对 结构的实例,就像使用 上课。你将直接工作 使用struct实例。因为 当将结构传递给 方法,而是通过值传递 作为参考


.

我想你可以看看

我看不出把
客户
变成一个结构有什么价值。字符串字段都将是引用类型,因此您不妨将整个内容设置为引用类型(即

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

List<Customer> Customers = new List<Customer>();
列出客户=新建列表();

无论如何,我不会使用结构,因为我很少需要提供一个没有某种关联行为(验证器、格式化程序等)的纯数据结构

关于“struct”的基本概念,我非常喜欢的一点是,它在最基本的层面上代表了一个存储系统,因此应该避免编写所有有害的自定义getter和setter之类的东西。。。但是再一次,我们现在有了这些可爱的自动属性,它们从纯粹的编码角度有效地实现了相同的结果,虽然我内心的雅格尼纳粹可能会说使用结构是因为它是简单的,但我内心的现实主义者知道我无论如何都不可避免地想要将结构更改为类,那么,为什么不从一开始就简单地实现这个类并完成它呢!;-)


至于性能和其他好处的论点。。。问自己“这真的重要吗?”。如果你正在写一个严肃的实时系统。。。也许你想使用另一种工具。如果你只是简单地传递一些数据,你可能已经有了大量的可供处理的数据块,而你的killer算法可能真的不需要担心它会产生纳秒级的差异。

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

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

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

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