我什么时候应该使用结构?

时间:2011-03-03 04:16:29

标签: .net class struct

如果我有一个类,它本质上只是一堆变量 - 没有方法,实际上更多的存储空间 - 将它转换为结构更好吗?

什么是何时使用结构以及何时使用类的“规则”?

6 个答案:

答案 0 :(得分:2)

规则一是它不应该大于16个字节。通常有4个字段。当抖动产生的代码大于此时,它会产生令人讨厌的急剧下降。这与“一堆变量”不兼容。简单的课程没有错。

答案 1 :(得分:1)

我的经验法则是当实体表示一个值(因此是不可变的)并且没有标识时(例如,“5”的两个实例是相同的)。因此,您应该覆盖==以及.Equals. String,例如,出于实际原因,这是一个类。同样,不要将结构用于少数几个字段。可能它可能会被进一步分解。

答案 2 :(得分:1)

- 默认情况下,类的成员和继承是私有的,而在struct中是公共的。

- 当对象标识比值更重要时使用类。当实例包含的值比实例标识更重要时,请使用结构。

- 结构是价值类型;类是引用类型。

-A结构必须至少有一个非共享变量或事件成员。一堂课可以完全是空的。

- 如果您需要处理事件使用类。

-class使用堆分配,而堆栈使用堆栈分配

- 如果你需要初始化任何成员值然后使用类,因为你无法在堆栈中执行此操作。

我想现在你可以理解这些差异了。现在你可以根据需要使用堆栈或类。

感谢 arefin

答案 3 :(得分:1)

来自Effective C#

  

值类型或引用类型?   结构或类?你应该什么时候   使用每个?这不是C ++,你在其中   将所有类型定义为值类型和   可以创建对它们的引用。这个   不是Java,其中一切都是   引用类型(除非你是其中之一   语言设计师)。你必须   决定你的类型的所有实例   将在您创建它时表现。它的   做出正确决定的重要决定   第一次。你必须和...一起生活   你决定的后果是因为   稍后改变可能会导致相当多   代码以微妙的方式打破。它的   选择结构的简单问题   创建时使用或类关键字   类型,但它的工作要多得多   使用您的类型更新所有客户端   如果你以后改变它。

     

这并不像优先选择那么简单   在另一个。正确的选择   取决于你期望如何使用   新型。值类型不是   多态。他们更适合   存储您的应用程序的数据   操纵。参考类型可以是   多态,应该习惯   定义你的行为   应用。考虑预期   你的新类型的责任,和   从这些责任来决定   要创建的类型。结构存储   数据。类定义了行为。

来自C# in Depth

  

假设你在读东西   太棒了,想要一位朋友阅读   它也。让我们进一步假设   它是公共领域的文档,   只是为了避免任何指责   支持侵犯版权。什么   你需要给你的朋友吗?   他也可以读它?这取决于   完全取决于你正在阅读的内容。

     

首先我们将处理案例   你手里拿着真纸。至   给你的朋友一份副本,你需要   复印所有页面,然后给予   对他而言。那时,他有他的   拥有该文件的完整副本。在   这种情况,我们正在处理   值类型行为。一切   信息直接在您的   手 - 你不需要去任何地方   否则得到它。你的副本   信息也是独立的   你的朋友是你的朋友   复制。你可以添加一些笔记   页面,他的页面不会   完全改变了。

     

将其与情况进行比较   你正在阅读一个网页。这次,   所有你必须给你的朋友   网页的网址。这是   引用类型行为,带有URL   取代参考。在   为了真正阅读文件,   你必须导航参考   将URL放在浏览器中   要求它加载页面。在   另一方面,如果网页发生变化   由于某种原因(想象它是一个维基   页面,你已经添加了你的笔记   页面),你和你的朋友   将在下次看到改变   每个人都加载页面。

     

我们在真实中看到的差异   世界形成了心脏   区分价值类型和   C#和.NET中的引用类型。最   .NET中的类型是引用类型,和   你可能会创造更多   引用而不是值类型。最多   要知道的常见情况是那些课程   (使用类声明)是参考   类型和结构(使用声明   struct)是值类型。另一个   情况如下:

     

数组类型甚至是引用类型   如果元素类型是值类型   (所以int []仍然是引用类型,   即使int是值类型)。

     

枚举(使用枚举声明)是   价值类型。

     

委托类型(使用声明声明)   delegate)是引用类型。

     

接口类型(使用声明声明)   接口)是引用类型,但是   它们可以通过价值来实现   类型。

     

现在我们已经了解了什么   引用类型和值类型   关于,我们将看一些最重要的   重要的细节。

答案 4 :(得分:0)

请参阅... this msdn article

  

结构与类

     

结构似乎与类相似,   但是有重要的区别   你应该知道的。首先   所有,类都是引用类型和   结构是值类型。通过使用   结构,你可以创建对象   表现得像内置类型和   也享受他们的好处。

     

堆还是堆?

     

当您调用New运算符时   上课时,会分配给   堆。但是,当您实例化一个   struct,它在堆栈上创建。   这将带来性能提升。   此外,你不会处理   对结构实例的引用   就像你上课一样。你将会   直接使用struct   实例。正因为如此,何时   将结构传递给方法,就是这样   通过值而不是作为a传递   参考

因此,如果您仅在方法中使用数据并且没有将其传递给函数,那么结构可以为您提供性能提升,因为它仅在堆栈上分配...如果您要将其传递给一堆函数然后一个类可能更好,因为它将通过引用传递而不是一遍又一遍地“复制”......

答案 5 :(得分:0)

结构通常用于表示单个有凝聚力的信息单元的少量数据。它们通常按值传递,包括传递它的副本而不是对对象本身的引用。

这意味着结构有几个小问题。如果

  • 数据将具有值语义 - 也就是说,如果可以克隆对象而不会导致问题,那么重要的是值而不是它们的身份;
  • 数据总量将小于约16个字节,因为运行时将最终复制它而不是仅传递引用;和
  • 如果它是不可变的,因为修改副本通常不会修改原件;

然后你可以使用结构。

如果其中任何一个不正确,您可能需要考虑将该课程保持为一个班级。