2016-02-03 46 views
1
public int MyWriteOnlyProperty1 { set; }  /* Error: Auto-Implemented properties must have get accessors.*/ 
public int MyWriteOnlyProperty2 { set { } } // No error 

爲什麼有一個編譯時錯誤,但其他錯誤沒有錯誤? 兩者之間是否有任何有意義的區別,因爲它是由哪個方式決定的?自動執行的屬性沒有得到編譯錯誤

+1

可能第二個屬性沒有被自動實現了......你可以比較MSIL去確定 –

+0

它會有什麼用處呢? –

+2

有意義的區別是,一個嘗試自動實現集(編譯器會創建一個隱藏的變量,將無法訪問),另一個是明確無所事事,這是可以的 – Les

回答

3

第二個不是自動實現的。在這種簡單的情況下,編譯器當然可能會發現你的屬性實現被破壞了(因爲setter沒有做任何事情),但是很難涵蓋「這個屬性被破壞」的每一個可能的情況,所以我想這就是爲什麼他們不打擾除了自動實現的屬性,它是微不足道的。

E.g.考慮這種性質的,有效的,但奇怪的用法:

private int _myValue; 
public int MyWriteOnlyProperty2 { set { _myValue = value; } } 

還是這個例子,其中的屬性是一樣的破你的榜樣,但現在很難對編譯器知道。更好的是把它留給開發者。

public int MyWriteOnlyProperty2 { set { DoNothing(value); } } 
private void DoNothing(int value) { //Does nothing } 
+0

我認爲沒有做任何事情是一個有效的方式來實現一個setter。例如,該屬性可以表示與此類型無關的設置,但必須實施以滿足界面。 – svick

+0

只有'set'的屬性並不奇怪。一個常見的地方,你會看到它是一個'密碼'屬性,可以分配給但不能回讀。 ['DirectoryEntry.Password'](https://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.password(v = vs.110).aspx)是該框架中的一個示例。 –

+1

微軟自己的設計指南指出,你不應該只使用setter來使用屬性,所以我認爲把它稱爲奇怪是安全的。如果您需要使用該模式,請改爲定義一種方法。 – Niclas

2

第二個不是自動實現的。你明確地實現了一個空主體的setter。擁有固定屬性是非常不尋常的,但它是有效的。編譯器的工作不是告訴你實現應該是什麼樣的,所以空的實體是有效的。

但是第一種情況沒有任何意義。自動實現的屬性使用不可訪問的後臺字段。有了它們,同時擁有getset(具有相同或不同的輔助功能)非常有意義。剛剛有get(它在C#6.0中有效)聽起來有點奇怪,但它確實有意義,因爲實際上可以在構造函數中設置後臺字段。

但是隻有set?這沒有用,沒有理由爲什麼你想寫入一個無法讀取的字段。 (只有在構造函數中讀取也沒有意義。)

相關問題