C# why need struct if class can cover it?
只是想知道如果类可以做所有的结构,为什么我们需要结构?我认为,在类中输入值类型没有副作用。
编辑:看不到使用结构的任何重要原因
结构类似于类,主要区别如下:
- 结构是值类型,而类是引用类型。
- 结构不支持继承(不包括从对象)。
- 结构可以具有所有成员类可以,但以下情况除外:
- 无参数构造函数
- 终结者
- 虚拟成员
当需要值类型语义时,使用结构而不是类。结构的好例子是数值类型,在这种类型中,复制值而不是引用更容易赋值。因为结构是值类型,所以每个实例不需要在堆上实例化对象。这在创建类型的许多实例时很重要。
自定义值类型不是绝对必要的,例如Java没有它们。然而,它们仍然有用。
例如,在noda时代,我们非常广泛地使用它们,作为一种高效的方式来表示诸如瞬间之类的东西,而不涉及对象的开销。
我不会说"类可以做所有的结构,可以做更多"—它们的行为不同,应该被认为是不同的。
为什么当一个
另外,对于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.
例如,假设你想援引创建过程()函数。另外,假设你想用一个星形图框结构来参数
Well,what's
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
记忆层的对应关系将是错误的,如
因此,支持援引接受仲裁结构的仲裁功能(即,P/Invoke is all about),其中一个必须:
完全支持值类型This allows C 35;to declare a value type for
在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、更好地控制内存表示。我们可以准确地定义结构在内存中的位置,这允许我们快速高效地序列化和反序列化一些二进制数据。
对于一般的应用程序开发人员来说,使用类是很正常的。从表面上看,类使结构看起来不必要,但是当您深入挖掘细节时,它们实际上是完全不同的。
有关结构和类之间的一些差异,请参见此处。
最著名的区别是类是引用类型,结构是值类型。这很重要,因为它允许库开发人员控制如何使用数据类型的实例。