在我最近的一个项目中,我在课堂上创建了一个结构来解决我遇到的问题,当一位同事看着我的肩膀时,他看起来很嘲弄这个结构,然后说“把它搬进一个班级”。
除了我 在这个类中需要它之外,我没有任何理由不将它移动到一个类中,但是这种情况会失败,因为我不能把它变成嵌套类吗?
什么时候可以使用结构?
答案 0 :(得分:14)
您应该查看值类型使用指南:http://msdn.microsoft.com/en-us/library/y23b5415(vs.71).aspx
文章列出了几个重点,但我认为最有价值的几点是以下
如果两个问题的答案都是肯定的,那么你几乎肯定想要使用一个结构。否则我会建议去上课。
使用具有大量成员的结构存在问题。但我发现,如果我考虑上面两点,我的价值类型中很少有超过建议的成员/大小数量。
答案 1 :(得分:8)
答案 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引用的使用指南非常出色,很好地涵盖了您不确定自己需要哪种情况。我将列出一些用例,其中结构的使用是要求。
这些通常是边缘情况和(互操作除外)不推荐的做法,除非项目/程序成功使用必要。