嗨,我創建在C#這純粹是抱着變量類的應用程序,它什麼也不做別的,而是設置和獲取這些變量。我想知道,爲了效率和良好的編碼實踐,如果我應該將這個類轉換爲一個結構體,以便正確使用它。我以前從未使用過結構,但一直在研究它們,但是我在使它工作時遇到了一些麻煩。任何意見,將不勝感激!
感謝, 斯圖爾特
嗨,我創建在C#這純粹是抱着變量類的應用程序,它什麼也不做別的,而是設置和獲取這些變量。我想知道,爲了效率和良好的編碼實踐,如果我應該將這個類轉換爲一個結構體,以便正確使用它。我以前從未使用過結構,但一直在研究它們,但是我在使它工作時遇到了一些麻煩。任何意見,將不勝感激!
感謝, 斯圖爾特
如果值模型的集合值類型(即東西,沒有自己的並且具有相同值的兩個實例的身份被認爲是相同)使用一個結構。
否則,請使用一個類。
謝謝,從這我會繼續使用一堂課。 – stuartmclark 2010-10-26 09:46:56
使用結構代替班級取決於您正在工作的場景。雖然您可以使用結構代替類,但結構缺乏實現訪問標識符(如Private,Public,Protected)的功能。如果您只是爲了保存變量而使用類,您也可以使用結構,但是如果您的類包含一些私有的,受保護的或公共方法或變量/屬性,則不能使用結構。
希望這會有所幫助!
struct *可以*具有私有方法。然而,「保護」方法沒有意義,因爲你不能從結構派生。 – 2010-10-26 09:19:05
結構或類的決定應該基於「我想引用類型語義或值類型語義嗎?」
當您使用struct作爲參數時,將複製完整的內容。對於一個類只是複製參考。所以一個「大結構」可能會有性能損失!
您使用結構時:
參考MCTS 70-536
有時需要具有大於16字節的結構。 '如果你不打算在創建實例後重新分配實例。'你的意思是:'你想要一個類型是(應該是)不可變的' – sloth 2010-10-26 09:20:00
也許你不喜歡那句話,我也不喜歡,我認爲現在好多了,MS建議的是什麼。 – 2010-10-26 10:11:25
在大多數情況下,班級是首選。結構通過價值傳遞,沒有繼承等等。你提到效率,這個類可能是性能瓶頸嗎?
如果你犯了一個結構不過,請先確認使它immutable
我不知道,使用一個結構或沒有涉及到良好的編碼習慣,但也有使用在某些情況下結構的一些性能優勢。例如,MSDN建議大小不超過16字節的類型可能比類更有效地由結構處理。
理解爲什麼結構可能是更好的選擇以及它們的內存如何由運行時管理很重要。必須以最小開銷快速執行的庫會考慮使用結構(例如XNA框架中的許多數學類型)。還有一些設計問題,比如你的結構總是有一個默認的構造函數;如果你想確保你的類型只能用特定的值構造,那麼struct不是最好的選擇。
它的長短是,除非你有一個非常具體的理由來使用類的結構,只是堅持類。
如果你想按結構前進,你有什麼問題與他們?
這真的取決於你想達到的目標。你現在只有getter和setter的事實並不意味着什麼。例如,一種類型可能是對從文件讀取的應用程序設置進行建模。在某些時候,您可能希望添加一個IsValid()或Normalize()方法。所以在這種情況下,你寧願去一個類然後一個結構。
當類型的身份由字段的值決定時,應該使用一個結構體。從.NET框架的一個很好的例子是點,其中有X和Y 的第二件事情是,結構應該是便宜的傳入和傳出功能:
public bool IsInRange(Point point)
{
// ...
}
記住這一點會現場被複制場在這裏,這樣應該相當便宜。
這是一個確切的副本。不要提供更多答案。這是毫無意義的。 – leppie 2010-10-26 09:27:57