C#为什么需要struct,如果类可以覆盖它?

C# why need struct if class can cover it?

只是想知道如果类可以做所有的结构,为什么我们需要结构?我认为,在类中输入值类型没有副作用。

编辑:看不到使用结构的任何重要原因

结构类似于类,主要区别如下:

  • 结构是值类型,而类是引用类型。
  • 结构不支持继承(不包括从对象)。
  • 结构可以具有所有成员类可以,但以下情况除外:
  • 无参数构造函数
  • 终结者
  • 虚拟成员

当需要值类型语义时,使用结构而不是类。结构的好例子是数值类型,在这种类型中,复制值而不是引用更容易赋值。因为结构是值类型,所以每个实例不需要在堆上实例化对象。这在创建类型的许多实例时很重要。


自定义值类型不是绝对必要的,例如Java没有它们。然而,它们仍然有用。

例如,在noda时代,我们非常广泛地使用它们,作为一种高效的方式来表示诸如瞬间之类的东西,而不涉及对象的开销。

我不会说"类可以做所有的结构,可以做更多"—它们的行为不同,应该被认为是不同的。


为什么当一个class作品使用struct?因为有时候你不工作

另外,对于Reed Copsey(短篇版本:Fewer Objects that the GC needs to Track,allowing the GC to do a better job)所述的绩效原因,有一个地方需要使用结构:P/Invoke to functions that require by-value structure or structure members.

例如,假设你想援引创建过程()函数。另外,假设你想用一个星形图框结构来参数CreateProcess()

Well,what's STARTUPINFOEX?This:

1
2
3
4
typedef struct _STARTUPINFOEX {
    STARTUPINFO                    StartupInfo;
    PPROC_THREAD_ATTRIBUTE_LIST    lpAttributeList;
} STARTUPINFOEX, *LPSTARTUPINFOEX;

含有作为其第一个成员的星图平福。是一种结构。

Since classes are reference types,if we declared the corresponding C 35;type thus:

ZZU1

记忆层的对应关系将是错误的,如STARTUPINFOEX.StartupInfo是一个指针(ILP32平台上有4个字节),而不是一个结构(ILP32平台上有68个字节)。

因此,支持援引接受仲裁结构的仲裁功能(即,P/Invoke is all about),其中一个必须:

  • 完全支持值类型This allows C 35;to declare a value type for STARTUPINFOwhich will have the right in-memory layout for marshaling

  • 在P/invoketable structures中,some alternate syntax within P/invoketable structures which would inform the runtime marshaler that this member should be laid out as a value type instead of a pointer.

  • (2)Is a work solution(and may have been used in J/direct in visual J+;I don't remember),but given that proper value types are more flexible,enable a number of performance optimizations no t otherwise achievable,and make sensible use within P/invoscenarios,i t's no surprise that C \ 355;supp


    一般来说,使用一个类。

    只有在绝对需要值类型语义时才使用结构。


    结构之所以有用,仅仅是因为它们是通过值传递的,这在某些算法中实际上是有用的。这实际上是类所不能做的。

    1
    2
    3
    4
    5
    struct ArrayPointer<T>
    {
        public T[] Array;
        public int Offset;
    }

    您可以将此结构传递给方法,并且该方法可以根据自己的需要更改偏移量的值。同时,一旦从方法返回,它的行为就好像偏移量从未更改过一样。


    出于性能原因,结构通常也是必需的。结构数组占用的内存要少得多,并且比对象引用数组获得更好的缓存一致性。如果您使用的是类似于渲染系统的系统,并且需要生成500万个顶点,则这一点非常重要。

    有关详细信息,请参阅Rico Mariani的绩效测验+答案。


    • C中的结构与类#
    • 结构使用技巧?
    • 为什么我们需要结构?(C)


    对于与win32 api使用的基础数据结构进行互操作几乎是必须的。我想把它放到.NET中的一个很大的原因可能就是这个原因。


    1、性能。在某些情况下,使用结构可以获得更好的性能。2、数据不可变性。通过更改结构的某些属性,您将得到一个新的结构。这在某些情况下非常有用3、更好地控制内存表示。我们可以准确地定义结构在内存中的位置,这允许我们快速高效地序列化和反序列化一些二进制数据。


    对于一般的应用程序开发人员来说,使用类是很正常的。从表面上看,类使结构看起来不必要,但是当您深入挖掘细节时,它们实际上是完全不同的。

    有关结构和类之间的一些差异,请参见此处。

    最著名的区别是类是引用类型,结构是值类型。这很重要,因为它允许库开发人员控制如何使用数据类型的实例。