簡體   English   中英

為什么沒有人接受C#中的公共字段?

[英]Why won't anyone accept public fields in C#?

似乎每個C#靜態分析器在看到公共字段時都想抱怨。 但為什么? 當然,有些情況下公共(或內部) 字段就足夠了,並且擁有get_set_方法的屬性沒有意義嗎? 如果我確定我不會重新定義該字段或添加它(副作用是壞的,對吧?) - 不應該是一個簡單的字段就足夠了怎么辦?

因為它破壞了封裝 - 這就是大多數人大量使用訪問器的原因。 但是,如果您認為它是適合您任務的正確解決方案,請忽略它(意味着嚴格的封裝投訴),並為您的項目做正確的事情。 不要讓OO納粹告訴你。

這真的是關於面向未來的代碼。 當你說(強調我的):

如果我確定我不會重新定義該字段或添加它(副作用是壞的,對吧?) - 不應該是一個簡單的字段就足夠了怎么辦?

這是一個絕對的陳述,正如我們所知(以及大多數靜態分析儀),生命中只有兩個絕對。

它只是試圖保護你。 如果這是一個問題,您應該能夠告訴分析儀忽略它(通過依賴於您正在使用的分析工具的屬性)。

鑒於當前的C#3.0允許自動屬性,其語法如下:

public int Property {get; set;}

在公共字段上使用屬性所需的額外工作幾乎為零。 問題是你永遠不能完全確定一個領域不會被不同地使用,或者訪問者不會改變,並且在工作中給予權衡,沒有理由不實現一個屬性。

無論如何,分析儀抱怨高比例的事情(在這種情況下,例如99.99%的情況)是糟糕的編程實踐......但無論如何它只是在抱怨。 字段可以公開,並且在某些極端情況下,其直接使用可能是合理的。 與以往一樣, 使用您的常識 ...但請記住最佳編程實踐的基本規則...... 是否有一個非常好的理由來打破常規? 如果有,那么繼續,如果沒有或如果答案是“它涉及更多的工作”然后堅持實踐......

因為稍后更改公共字段以獲取/設置訪問器將破壞代碼。 有關更多信息,請參閱此答案

一般來說,隱藏屬性后面的字段是個好主意,即使你“確切地知道”你不會重新定義字段。 經常,你今天“確切知道”的東西明天會發生變化。 並且,使一個屬性來引用一個字段只是一點點麻煩。

也就是說,靜態分析儀無法替代思想。 如果您對您的設計感到滿意,並且您的判斷分析器是錯誤的,那么在這種情況下忽略或(如果可能)抑制該警告。

我認為重點是,通常你不確定你不會重新定義該字段或稍后添加它。 封裝和隱藏數據的全部意義在於,您可以自由地執行這些操作,而無需更改公共接口並隨后破壞依賴類。 如果您的屬性訪問器只是簡單的get / sets,那么無論如何它們都會被編譯到那個,因此不存在性能問題 - 鑒於此問題應該是否有充分的理由不使用它們?

另外一個好處屬性是在做反射時。 當您反思您的課程時,您可以一次性獲得所有屬性,而不必獲取屬性和字段。

讓我們不要忘記,在使用多個線程時,訪問器可以為您提供靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM