標籤:
很困惑,為什麼C#會有struct 這樣一個關鍵字。雖然我用C#幾年了,但絕少用到此關鍵字。我在相關書籍上學習C#的時候,看到過struct內容——但C#並不是我的第一入門語言,所以沒有那麼細緻的學習。這其中也有一部分原因是有些書籍會淡化struct,更在的原因則在於我的先驗經驗上。忽略struct關鍵字的理由如下:
- 已經有class了,還有struct幹啥?節約記憶體?這不是C#的主要賣點吧。
- 各種神奇的限制。既然如此,就更不想用了。
- 難道只是為了與C++、win32的互操作?現在應用越來越遠離OS,情境也難得碰到,還是不用吧。
大概如此想法吧。最近當做面試官,面試了一些應聘者,另一C++出生的哥們,問到了struct與class的區別——甚至記憶體布局,一想到自己也不甚清楚,還是瞭解一下吧。C++出身的人,總是不忘記憶體。
在MSDN上找到關於struct的相關資訊:strcut是實值型別,而class是參考型別。struct在賦值時,是拷貝操作。而參考型別,只是引用了同一內容。實值型別類似C語言中的函數形參,而參考型別類似實參。還擁有實值型別的一些其他特徵,比如可空(Nullable),等等。
使用上還有其他一些特徵與限制[1],但我更想知道為什麼要有struct。
- 可以自訂新的實值型別。一般實值型別只有原始基本類型,比如int, byte。
- 結構最適合一些小型資料結構,這些資料結構包含的資料以建立結構後不修改的資料為主。[2]
- 結構更加有效,也就是更加節省記憶體, 提升處理效率[3]。因為沒有class的很多特性,所以也沒有class的中繼資料塊。
- 結構是實值型別,而實值型別是可計算的,擁有可計算的語義。例如DataTime。[4]
從以上內容可以看出使用struct的一般情境:
- 自訂的類型語義上為實值型別。穩定不變的,可計算的。
- 需要更高效率的情境。
關於上述第二點,記得其失去了物件導向很多特性。
[1] 結構(C#編程指南), https://msdn.microsoft.com/zh-cn/library/saxz13w4(v=vs.90).aspx
[2] 類和結構(C#編程), https://msdn.microsoft.com/zh-cn/library/ms173109.aspx
[3] 使用結構(C#編程指南), https://msdn.microsoft.com/zh-cn/library/0taef578.aspx
[4] 深入理解C#,人民郵電出版社, p41-43
C# struct