簡體   English   中英

具有空訪問者的屬性

[英]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方法,那么有兩個選項:

  1. 設置器是冗余的,屬性應該是只讀的,或者
  2. 您的代碼中存在一部分將設置此值並錯誤地假設它有效。

暫無
暫無

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

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