NET问答:什么场景下应该选择 struct 而不是 class ?
咨詢區(qū)
Esteban Araya:
MSDN 上說當(dāng)你需要一個(gè)輕量級(jí)對(duì)象時(shí)應(yīng)該選擇 struct,說的含含糊糊,真的不知道有哪些場(chǎng)景下優(yōu)先選擇 struct 而不是 class。
可能有些人已經(jīng)忘了。
struct 可以有方法。
struct 不能被繼承。
我非常明白 struct 和 class 在技術(shù)上的不同,就是把不準(zhǔn)什么場(chǎng)景下該使用它????????????...
回答區(qū)
Yashwanth Chowdary Kata:
使用 class 的情況
如果同一性非常重要,畢竟 struct 傳遞時(shí)是完整copy的。
如果需要占用很大內(nèi)存。
如果你有繼承/多態(tài)的需求。
使用 struct 的情況
如果你想使用基元類型 (int,long,byte ...)
如果你想精細(xì)的優(yōu)化內(nèi)存
如果 P/Invoke 必須傳值類型。
如果你想減少 GC 的負(fù)載
如果沒有 繼承/多態(tài) 的需求。
Andrei R?nea:
申明一下,我沒看過其他人的答案,我覺得最重要的方面是:當(dāng)我需要一個(gè)無需 唯一標(biāo)識(shí) 的類型時(shí)用 struct,比如說:3D 點(diǎn)。
public?struct?ThreeDimensionalPoint {public?readonly?int?X,?Y,?Z;public?ThreeDimensionalPoint(int?x,?int?y,?int?z){this.X?=?x;this.Y?=?y;this.Z?=?z;}public?override?string?ToString(){return?"(X="?+?this.X?+?",?Y="?+?this.Y?+?",?Z="?+?this.Z?+?")";}public?override?int?GetHashCode(){return?(this.X?+?2)?^?(this.Y?+?2)?^?(this.Z?+?2);}public?override?bool?Equals(object?obj){if?(!(obj?is?ThreeDimensionalPoint))return?false;ThreeDimensionalPoint?other?=?(ThreeDimensionalPoint)obj;return?this?==?other;}public?static?bool?operator?==(ThreeDimensionalPoint?p1,?ThreeDimensionalPoint?p2){return?p1.X?==?p2.X?&&?p1.Y?==?p2.Y?&&?p1.Z?==?p2.Z;}public?static?bool?operator?!=(ThreeDimensionalPoint?p1,?ThreeDimensionalPoint?p2){return?!(p1?==?p2);} }值得注意的是,當(dāng)用值類型替代引用類型后,當(dāng)心 按值copy 的問題。
Eduardas ?lutas:
這是一個(gè)老話題了,我就提供一下 class 和 struct 的 benchmark 吧,有如下兩個(gè) .cs 文件。
public?class?TestClass {public?long?ID?{?get;?set;?}public?string?FirstName?{?get;?set;?}public?string?LastName?{?get;?set;?} }public?struct?TestStruct {public?long?ID?{?get;?set;?}public?string?FirstName?{?get;?set;?}public?string?LastName?{?get;?set;?} }運(yùn)行 benchmark:
Create 1 TestClass
Create 1 TestStruct
Create 100 TestClass
Create 100 TestStruct
Create 10000 TestClass
Create 10000 TestStruct
輸出結(jié)果:
BenchmarkDotNet=v0.12.0,?OS=Windows?10.0.18362 Intel?Core?i5-8250U?CPU?1.60GHz?(Kaby?Lake?R),?1?CPU,?8?logical?and?4?physical?cores .NET?Core?SDK=3.1.101 [Host]?????:?.NET?Core?3.1.1?(CoreCLR?4.700.19.60701,?CoreFX?4.700.19.60801),?X64?RyuJIT??[AttachedDebugger] DefaultJob?:?.NET?Core?3.1.1?(CoreCLR?4.700.19.60701,?CoreFX?4.700.19.60801),?X64?RyuJIT|?????????Method?|???????????Mean?|?????????Error?|????????StdDev?|?????Ratio?|?RatioSD?|?Rank?|????Gen?0?|?Gen?1?|?Gen?2?|?Allocated?| |---------------?|---------------:|--------------:|--------------:|----------:|--------:|-----:|---------:|------:|------:|----------:||??????UseStruct?|??????0.0000?ns?|?????0.0000?ns?|?????0.0000?ns?|?????0.000?|????0.00?|????1?|????????-?|?????-?|?????-?|?????????-?| |???????UseClass?|??????8.1425?ns?|?????0.1873?ns?|?????0.1839?ns?|?????1.000?|????0.00?|????2?|???0.0127?|?????-?|?????-?|??????40?B?| |???Use100Struct?|?????36.9359?ns?|?????0.4026?ns?|?????0.3569?ns?|?????4.548?|????0.12?|????3?|????????-?|?????-?|?????-?|?????????-?| |????Use100Class?|????759.3495?ns?|????14.8029?ns?|????17.0471?ns?|????93.144?|????3.24?|????4?|???1.2751?|?????-?|?????-?|????4000?B?| |?Use10000Struct?|??3,002.1976?ns?|????25.4853?ns?|????22.5920?ns?|???369.664?|????8.91?|????5?|????????-?|?????-?|?????-?|?????????-?| |??Use10000Class?|?76,529.2751?ns?|?1,570.9425?ns?|?2,667.5795?ns?|?9,440.182?|??346.76?|????6?|?127.4414?|?????-?|?????-?|??400000?B?|點(diǎn)評(píng)區(qū)
確實(shí)這是一個(gè)老話題了,我一般在講究?jī)?nèi)存優(yōu)化的場(chǎng)景下,優(yōu)先考慮 struct,畢竟 struct 沒有 object 的 同步塊索引 + 方法表指針,在 64bit 機(jī)器上,光這塊開銷就是 16byte,如果再放大千萬倍那可不得了????????????,其他的場(chǎng)景怎么搞都行。
原文鏈接:https://stackoverflow.com/questions/85553/when-should-i-use-a-struct-instead-of-a-class
總結(jié)
以上是生活随笔為你收集整理的NET问答:什么场景下应该选择 struct 而不是 class ?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里25k 百度25k,招WPF!
- 下一篇: 希尔排序听起来有点难,其实很简单