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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

咨詢區

  • Esteban Araya

MSDN 上說當你需要一個輕量級對象時應該選擇 struct,說的含含糊糊,真的不知道有哪些場景下優先選擇 struct 而不是 class。

可能有些人已經忘了。

  • struct 可以有方法。

  • struct 不能被繼承。

我非常明白 struct 和 class 在技術上的不同,就是把不準什么場景下該使用它????????????...

回答區

  • Yashwanth Chowdary Kata

使用 class 的情況

  • 如果同一性非常重要,畢竟 struct 傳遞時是完整copy的。

  • 如果需要占用很大內存。

  • 如果你有繼承/多態的需求。

使用 struct 的情況

  • 如果你想使用基元類型 (int,long,byte ...)

  • 如果你想精細的優化內存

  • 如果 P/Invoke 必須傳值類型。

  • 如果你想減少 GC 的負載

  • 如果沒有 繼承/多態 的需求。


  • Andrei R?nea

申明一下,我沒看過其他人的答案,我覺得最重要的方面是:當我需要一個無需 唯一標識 的類型時用 struct,比如說:3D 點。

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);} }

值得注意的是,當用值類型替代引用類型后,當心 按值copy 的問題。


  • Eduardas ?lutas

這是一個老話題了,我就提供一下 class 和 struct 的 benchmark 吧,有如下兩個 .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;?} }

運行 benchmark:

  • Create 1 TestClass

  • Create 1 TestStruct

  • Create 100 TestClass

  • Create 100 TestStruct

  • Create 10000 TestClass

  • Create 10000 TestStruct

輸出結果:

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?|

點評區

確實這是一個老話題了,我一般在講究內存優化的場景下,優先考慮 struct,畢竟 struct 沒有 object 的 同步塊索引 + 方法表指針,在 64bit 機器上,光這塊開銷就是 16byte,如果再放大千萬倍那可不得了????????????,其他的場景怎么搞都行。

原文鏈接:https://stackoverflow.com/questions/85553/when-should-i-use-a-struct-instead-of-a-class

總結

以上是生活随笔為你收集整理的NET问答:什么场景下应该选择 struct 而不是 class ?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。