为什么我们需要结构? (C#)

时间:2009-08-01 16:52:29

标签: c#

要使用结构,我们需要实例化结构并像使用类一样使用它。那为什么我们不首先创建一个类?

9 个答案:

答案 0 :(得分:18)

结构是一种值类型,所以如果你创建一个副本,它实际上会实际复制数据,而对于一个类,它只会复制对数据的引用

答案 1 :(得分:8)

classstruct的语义之间的主要区别在于struct具有值语义。这意味着如果你有两个相同类型的变量,它们每个都有自己的数据副本。因此,如果给定值类型的变量设置为等于另一个(相同类型),则对一个的操作不会影响另一个(即,值类型的赋值会创建副本)。这与参考类型形成鲜明对比。

还有其他不同之处:

  1. 值类型隐式sealed(无法从值类型派生)。
  2. 值类型不能为null
  3. 为值类型提供一个默认构造函数,将值类型初始化为其默认值。
  4. 值类型的变量始终是该类型的值。将此与类A的变量引用类B的实例(如果B派生自A)的类进行对比。
  5. 由于语义不同,将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)

其中一个主要原因是,在方法调用期间用作局部变量时,会在堆栈上分配结构。

堆栈分配很便宜,但最大的区别是解除分配也非常便宜。在这种情况下,垃圾收集器不必跟踪结构 - 当从弹出堆栈帧时分配它们的方法返回时它们被删除。

  • 编辑 - 澄清了我的帖子:Jon Skeet的评论。

答案 7 :(得分:1)

结构对类有许多不同的语义。差异很大,但存在的主要原因是:

  1. 他们可以在memmory中明确地列出来
    • 这允许某些互操作场景
  2. 他们可以在堆栈上分配
    • 以更简单的方式制作某些高性能代码

答案 8 :(得分:-1)

struct是值类型(如Int32),而class是引用类型。结构是在堆栈而不是堆上创建的。此外,当结构传递给方法时,会传递结构的副本,但是当传递类实例时,会传递引用。

如果您需要创建自己的数据类型,那么结构通常是比类更好的选择,因为您可以像使用.NET框架中的内置值类型一样使用它。有一些很好的结构示例you can read here