2012-01-16 75 views
3

雖然我當然熟悉汽車的屬性的,我只是碰到這種跑在工作,這似乎是一個完全不同的野獸:屬性與空存取

public SomeType SomeProp 
{ 
    get 
    { 
    return someField; 
    } 
    set 
    { 
    } 
} 

我很驚訝,它甚至編譯,我想它一定是一個bug:物業似乎允許設置,但這樣做絕對沒有。

這個構造有用嗎?它是否像電梯中的那些「關門」按鈕不做任何事情,但讓用戶感覺良好?

+0

我猜是因爲那些_features_'C#'是這裏最受歡迎的標籤... =) – gdoron 2012-01-16 17:27:18

+0

@gdoron:這是一個非常方便的功能,可以替代顯式的get/set方法,就像您需要在C++或Java。這就像問爲什麼一個空的'setSomeProp(SomeType s)'方法編譯。 – Groo 2012-01-16 17:33:06

回答

4

當Web服務中需要序列化結果或使用XML或二進制序列化程序時,您經常會看到這一點。

這是懶惰和馬虎,但它經常發生。這使該對象具有屬性可設置的「外觀」。如果它是爲了實現一個接口並允許編譯完成的,那麼開發人員需要用一個鈍的對象寬宏地打擊頭部和肩膀,因爲他只是打破了界面。如果有一個有效的理由無法實現,那麼開發人員需要將其退回給架構師進行審查。實現接口時,不要只留下空的殘留方法。如果您目前沒有爲實現定義的技術,那麼至少會拋出一個新的NotImplementedException,以便單元測試能夠捕獲它。

就序列化而言:ReadOnly屬性不包含在常規序列化中,並且可能使該屬性對Web服務客戶端不可用。 (ref:Read-Only Properties Cannot Be Exposed by XML Web Services。)這是我們應該轉向WCF和DataContracts的原因之一。如果您通過WCF將此類作爲輸入類型接受,則再次檢索鈍器對象。

+2

+1使用暴力。 – Groo 2012-01-16 17:47:48

2

這似乎並不有用,但考慮一個需要類具有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 
     } 
    } 
} 
+0

所以你應該在'C#4.0'中使用'adapter design pattern'或動態' – gdoron 2012-01-16 17:29:37

+0

@parapura:我還沒有遇到過這個用例。讓呼叫者認爲他們已經設定了一個價值,但卻沒有做任何事情,這是相當鬼鬼祟祟的。 – Groo 2012-01-16 17:34:59

+1

我看不出你爲什麼要故意以這種方式誤導你的代碼的用戶。如果你不打算實現一個接口的一部分,至少應該拋出新的NotImplementedException(「解釋」);' – 2012-01-16 17:51:32

5

爲什麼你會期望它不能編譯?有效地,setter只是一個具有單個參數的無效方法。您可以非常容易地編寫破碎的方法,而無需期望編譯器注意到 - 屬性也是如此。然而,除了「部分」實現外,我不能想象任何情況下,這將是故意的,例如,演示語言功能,或者如果您正在測試確實設置了一個屬性,但您不在乎測試設置的是什麼。 (我個人仍然通常至少記錄該屬性已被設置。)

1

有幾個用例,這將是一個必要的解決方法,其中一些我已經遇到過「在野外」。

例如:該物業是一個來自舊時代的遺物,不再使用,但該應用程序的其他部分從未更新過(來源丟失?第三方?)並堅持設置該物業。我已經看到,在舊代碼中,更新某些數據集後需要插件設置isDirty屬性,當實現更改爲觀察其自身的數據集時,isDirty屬性變得無用,但無法保留,因爲其他代碼仍然存在想要設置它。

1

我會建議避免這種編程。它編譯,因爲沒有理由不應該,但如果接口需要您實現一個setter方法,那麼有兩種選擇:

  1. 無論是二傳是多餘的,物業應該做只讀只有或
  2. 存在一部分代碼,它將設置此值並錯誤地假定其工作。
+0

+ 1爲誤導其他編碼器的概念。在那些可以看到這些構件的情況下,追趕它們,修復它們,並且如果可能的話,與建築師和之前的開發人員進行非常尖銳的討論。 – EoRaptor013 2012-07-27 01:24:21