日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NET问答:什么场景下应该选择 struct 而不是 class ?

發(fā)布時(shí)間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NET问答:什么场景下应该选择 struct 而不是 class ? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

咨詢區(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。