[英]Properties with empty accessors
雖然我當然熟悉自動屬性,但我在工作中遇到過這個問題,這似乎是一個截然不同的野獸:
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
我很驚訝它甚至編譯,我想它一定是一個bug:該屬性似乎允許設置,但這樣做絕對沒有。
這個結構有用嗎? 電梯中的那些“關門”按鈕是不是做了什么,但讓用戶感覺良好?
為什么你不期望它不編譯? 有效地,setter只是一個帶有單個參數的void方法。 您可以非常輕松地編寫損壞的方法,而無需編譯器注意 - 屬性也是如此。
我不能很容易想象這個地方會是故意的,但是其他比“偏”實現任何情況下-例如演示語言特性,或者如果你要測試的東西, 並設置屬性,但你不關心什么測試設置為。 (我個人通常至少會記錄該物業已被設定。)
當結果需要在Web服務中序列化或使用XML或二進制序列化程序時,您經常會看到這種情況。
這是懶惰和草率,但它經常發生。 這使對象具有屬性可設置的“外觀”。 如果它是為了實現一個接口並允許編譯,那么做它的開發人員需要被一個鈍器對頭部和肩膀大肆毆打,因為他剛剛打破了界面。 如果存在無法實現的正當理由,則開發人員需要將其重新提交給架構師進行審核。 實現接口時,不要只留下空的存根方法。 如果您目前沒有為實現定義的技術,那么至少拋出一個新的NotImplementedException,以便單元測試能夠捕獲它。
就序列化而言:ReadOnly屬性不會包含在常規序列化中,並且可能使該屬性對Web服務客戶端不可用。 (參考: XML Web服務不能公開只讀屬性 。)這是我們應該轉向WCF和DataContracts的原因之一。 如果您通過WCF接受此類作為方法的輸入類型,則再次檢索鈍對象。
這本身似乎並不有用,但考慮一個需要類具有SomeProp
的接口,您需要在類中實現此接口,但SomeProp
只能讀取且不可寫。
public interface IQuestion
{
public int AnwserToLife { get; set; } //leave out 'set' for read-only
}
public class HitchHiker : IQuestion
{
public int AnwserToLife
{
get
{
return 42;
}
set
{
//never changes
}
}
}
有一些用例,這將是一個必要的解決方法,其中一些我已經“在野外”遇到過。
例如:該屬性是舊時的遺骸,不再使用,但應用程序的其他部分從未更新過(源丟失?第三方?)並堅持設置該屬性。 我已經看到,在舊代碼中,需要插件在更新某些數據集后設置isDirty屬性,當實現更改為觀察自身的數據集時,isDirty屬性變得無用,但無法放棄,因為其他代碼仍然想要設置它。
我建議避免這種編程。 它編譯,因為它沒有理由不應該,但如果接口要求你實現一個setter方法,那么有兩個選項:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.