什么时候可以使用结构而不是类

时间:2009-04-10 19:52:06

标签: c# .net vb.net

在我最近的一个项目中,我在课堂上创建了一个结构来解决我遇到的问题,当一位同事看着我的肩膀时,他看起来很嘲弄这个结构,然后说“把它搬进一个班级”。

除了我 在这个类中需要它之外,我没有任何理由不将它移动到一个类中,但是这种情况会失败,因为我不能把它变成嵌套类吗?

什么时候可以使用结构?

5 个答案:

答案 0 :(得分:14)

您应该查看值类型使用指南:http://msdn.microsoft.com/en-us/library/y23b5415(vs.71).aspx

文章列出了几个重点,但我认为最有价值的几点是以下

  • 值是不可变的吗?
  • 您希望该类型具有值语义吗?

如果两个问题的答案都是肯定的,那么你几乎肯定想要使用一个结构。否则我会建议去上课。

使用具有大量成员的结构存在问题。但我发现,如果我考虑上面两点,我的价值类型中很少有超过建议的成员/大小数量。

答案 1 :(得分:8)

MSDN有一个很好的guidelines document来涵盖结构使用情况。总结一下:

  • 像原始类型一样行事。
  • 实例大小不超过16个字节。
  • 是不可变的。
  • 值语义是可取的。

否则,请使用课程。

答案 2 :(得分:2)

您应始终使用Class作为首选,仅在非常具体的情况下更改为Structure(正如其他人已经列出的那样)。

根据您“在此课程中只需要它”的数量,您可以使用anonymous type完全避免嵌套类型;这只能在单个方法中使用:

Public Class Foo
    Public Sub Bar
        Dim baz = New With { .Str = "String", .I = 314 }
    End Sub
End Class

你不能(很容易 - 你可以用泛型做一些事情)以类型安全的方式将实例baz移到Sub之外。当然,Object可以保存任何内容,甚至是匿名类型的实例。

答案 3 :(得分:0)

我认为如果你需要复制对象或者不希望它被传递的函数修改,那么结构很棒。由于传递的函数不能修改原来传递的结构而是得到了它的新副本,这可以节省生命。 (除非他们明显地通过了ByRef)并且可以省去.NET中深度复制疯狂的麻烦或者实现ICloneSomething实现的痛苦。

但总体思路是以更加语义的方式定义自定义数据结构。

关于搬到一个班级,如果你要进入一个班级的班级,一般来说这是一个好习惯,因为你的结构99%的时间与你的一个班级无关命名空间。

如果要将其转换为类,那么您需要考虑“它是否定义数据结构”并且“它是否昂贵?”因为它会在整个地方被复制,“你想要受到路人修改的影响吗?”

答案 4 :(得分:0)

Marc和Rex引用的使用指南非常出色,很好地涵盖了您不确定自己需要哪种情况。我将列出一些用例,其中结构的使用是要求

  • 当您需要在内存中设置字段的布局时
    • 与非托管代码互操作。
    • 如果您想制作Unions
  • 您需要fixed size buffer内联。
  • 您希望能够使用 relative 安全性执行相当于reinterpret_cast的操作(只要该struct不包含任何本身是引用类型的字段。

这些通常是边缘情况和(互操作除外)不推荐的做法,除非项目/程序成功使用必要