雖然我當然熟悉汽車的屬性的,我只是碰到這種跑在工作,這似乎是一個完全不同的野獸:屬性與空存取
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
我很驚訝,它甚至編譯,我想它一定是一個bug:物業似乎允許設置,但這樣做絕對沒有。
這個構造有用嗎?它是否像電梯中的那些「關門」按鈕不做任何事情,但讓用戶感覺良好?
雖然我當然熟悉汽車的屬性的,我只是碰到這種跑在工作,這似乎是一個完全不同的野獸:屬性與空存取
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
我很驚訝,它甚至編譯,我想它一定是一個bug:物業似乎允許設置,但這樣做絕對沒有。
這個構造有用嗎?它是否像電梯中的那些「關門」按鈕不做任何事情,但讓用戶感覺良好?
當Web服務中需要序列化結果或使用XML或二進制序列化程序時,您經常會看到這一點。
這是懶惰和馬虎,但它經常發生。這使該對象具有屬性可設置的「外觀」。如果它是爲了實現一個接口並允許編譯完成的,那麼開發人員需要用一個鈍的對象寬宏地打擊頭部和肩膀,因爲他只是打破了界面。如果有一個有效的理由無法實現,那麼開發人員需要將其退回給架構師進行審查。實現接口時,不要只留下空的殘留方法。如果您目前沒有爲實現定義的技術,那麼至少會拋出一個新的NotImplementedException,以便單元測試能夠捕獲它。
就序列化而言:ReadOnly屬性不包含在常規序列化中,並且可能使該屬性對Web服務客戶端不可用。 (ref:Read-Only Properties Cannot Be Exposed by XML Web Services。)這是我們應該轉向WCF和DataContracts的原因之一。如果您通過WCF將此類作爲輸入類型接受,則再次檢索鈍器對象。
+1使用暴力。 – Groo 2012-01-16 17:47:48
這似乎並不有用,但考慮一個需要類具有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
}
}
}
爲什麼你會期望它不能編譯?有效地,setter只是一個具有單個參數的無效方法。您可以非常容易地編寫破碎的方法,而無需期望編譯器注意到 - 屬性也是如此。然而,除了「部分」實現外,我不能想象任何情況下,這將是故意的,例如,演示語言功能,或者如果您正在測試確實設置了一個屬性,但您不在乎測試設置的是什麼。 (我個人仍然通常至少記錄該屬性已被設置。)
有幾個用例,這將是一個必要的解決方法,其中一些我已經遇到過「在野外」。
例如:該物業是一個來自舊時代的遺物,不再使用,但該應用程序的其他部分從未更新過(來源丟失?第三方?)並堅持設置該物業。我已經看到,在舊代碼中,更新某些數據集後需要插件設置isDirty屬性,當實現更改爲觀察其自身的數據集時,isDirty屬性變得無用,但無法保留,因爲其他代碼仍然存在想要設置它。
我會建議避免這種編程。它編譯,因爲沒有理由不應該,但如果接口需要您實現一個setter方法,那麼有兩種選擇:
+ 1爲誤導其他編碼器的概念。在那些可以看到這些構件的情況下,追趕它們,修復它們,並且如果可能的話,與建築師和之前的開發人員進行非常尖銳的討論。 – EoRaptor013 2012-07-27 01:24:21
我猜是因爲那些_features_'C#'是這裏最受歡迎的標籤... =) – gdoron 2012-01-16 17:27:18
@gdoron:這是一個非常方便的功能,可以替代顯式的get/set方法,就像您需要在C++或Java。這就像問爲什麼一個空的'setSomeProp(SomeType s)'方法編譯。 – Groo 2012-01-16 17:33:06