要使用结构,我们需要实例化结构并像使用类一样使用它。那为什么我们不首先创建一个类?
答案 0 :(得分:18)
结构是一种值类型,所以如果你创建一个副本,它实际上会实际复制数据,而对于一个类,它只会复制对数据的引用
答案 1 :(得分:8)
class
和struct
的语义之间的主要区别在于struct
具有值语义。这意味着如果你有两个相同类型的变量,它们每个都有自己的数据副本。因此,如果给定值类型的变量设置为等于另一个(相同类型),则对一个的操作不会影响另一个(即,值类型的赋值会创建副本)。这与参考类型形成鲜明对比。
还有其他不同之处:
sealed
(无法从值类型派生)。null
。A
的变量引用类B
的实例(如果B
派生自A
)的类进行对比。由于语义不同,将struct
称为“轻量级类”是不合适的。
答案 2 :(得分:6)
在C#中,struct是一种值类型,与引用类型的类不同。这导致它们的处理方式或预期如何使用它们的巨大差异。
你应该阅读一本书中的结构。 C#中的结构不像C ++或Java那样是类的近亲。
答案 3 :(得分:5)
我在其他答案中看到的所有原因都很有趣并且很有用,但是如果你想了解它们为什么必需(至少是由VM)以及为什么它是< em>错误让JVM不支持它们(用户定义的值类型),请阅读Demystifying Magic: High-level Low-level Programming。就目前而言,C#在谈论将安全的托管代码引入系统编程的潜力时会熠熠生辉。这也是我认为CLI是移动计算的优越平台[比JVM]的原因之一。链接文件中列出了其他一些原因。
重要的是要注意,如果有的话,你很少会看到使用结构时可观察到的性能提升。垃圾收集器非常快,在许多情况下实际上会超过结构。当你添加它们的细微差别时,它们肯定不是首选工具。但是,当您确实需要它们并使用分析器结果或系统级构造来证明它时,它们就可以完成工作。
编辑:如果你想要回答为什么我们需要它们而不是他们做什么,^^^
答案 4 :(得分:3)
这是一个总是在堆上创建struct的神话。 好的是,struct是值类型,类是引用类型。但请记住
<强> 1。参考类型总是在堆上 2.值类型转到声明的位置。
现在第二行的意思是我将用下面的例子来解释
考虑以下方法
public void DoCalulation()
{
int num;
num=2;
}
此处num是一个局部变量,因此它将在堆栈上创建。
现在考虑以下示例
public class TestClass
{
public int num;
}
public void DoCalulation()
{
TestClass myTestClass = new TestClass ();
myTestClass.num=2;
}
此时num是在堆上创建的num.Ya在某些情况下,值类型执行的不仅仅是引用类型,因为它们不需要垃圾回收。
还记得:
值类型的值始终是该类型的值。 引用类型的值始终是引用。
你必须考虑这个问题,如果你期望有很多实例化,那么这意味着更多的堆空间将会处理,更多的是垃圾收集器的工作。对于这种情况,你可以选择结构。 / p>
答案 5 :(得分:1)
不同之处在于结构是值类型 我发现它们在两种情况下很有用
1)Interop - 您可以指定结构的内存布局,这样您就可以保证在调用非托管调用时。
2)性能 - 在某些(非常有限的)情况下,结构可能比类快,一般来说,这需要结构很小(我听到16字节或更少),并且不经常更改。
答案 6 :(得分:1)
其中一个主要原因是,在方法调用期间用作局部变量时,会在堆栈上分配结构。
堆栈分配很便宜,但最大的区别是解除分配也非常便宜。在这种情况下,垃圾收集器不必跟踪结构 - 当从弹出堆栈帧时分配它们的方法返回时它们被删除。
答案 7 :(得分:1)
结构对类有许多不同的语义。差异很大,但存在的主要原因是:
答案 8 :(得分:-1)
struct是值类型(如Int32),而class是引用类型。结构是在堆栈而不是堆上创建的。此外,当结构传递给方法时,会传递结构的副本,但是当传递类实例时,会传递引用。
如果您需要创建自己的数据类型,那么结构通常是比类更好的选择,因为您可以像使用.NET框架中的内置值类型一样使用它。有一些很好的结构示例you can read here。