public int MyWriteOnlyProperty1 { set; } /* Error: Auto-Implemented properties must have get accessors.*/
public int MyWriteOnlyProperty2 { set { } } // No error
爲什麼有一個編譯時錯誤,但其他錯誤沒有錯誤? 兩者之間是否有任何有意義的區別,因爲它是由哪個方式決定的?自動執行的屬性沒有得到編譯錯誤
public int MyWriteOnlyProperty1 { set; } /* Error: Auto-Implemented properties must have get accessors.*/
public int MyWriteOnlyProperty2 { set { } } // No error
爲什麼有一個編譯時錯誤,但其他錯誤沒有錯誤? 兩者之間是否有任何有意義的區別,因爲它是由哪個方式決定的?自動執行的屬性沒有得到編譯錯誤
第二個不是自動實現的。在這種簡單的情況下,編譯器當然可能會發現你的屬性實現被破壞了(因爲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 }
我認爲沒有做任何事情是一個有效的方式來實現一個setter。例如,該屬性可以表示與此類型無關的設置,但必須實施以滿足界面。 – svick
只有'set'的屬性並不奇怪。一個常見的地方,你會看到它是一個'密碼'屬性,可以分配給但不能回讀。 ['DirectoryEntry.Password'](https://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.password(v = vs.110).aspx)是該框架中的一個示例。 –
微軟自己的設計指南指出,你不應該只使用setter來使用屬性,所以我認爲把它稱爲奇怪是安全的。如果您需要使用該模式,請改爲定義一種方法。 – Niclas
第二個不是自動實現的。你明確地實現了一個空主體的setter。擁有固定屬性是非常不尋常的,但它是有效的。編譯器的工作不是告訴你實現應該是什麼樣的,所以空的實體是有效的。
但是第一種情況沒有任何意義。自動實現的屬性使用不可訪問的後臺字段。有了它們,同時擁有get
和set
(具有相同或不同的輔助功能)非常有意義。剛剛有get
(它在C#6.0中有效)聽起來有點奇怪,但它確實有意義,因爲實際上可以在構造函數中設置後臺字段。
但是隻有set
?這沒有用,沒有理由爲什麼你想寫入一個無法讀取的字段。 (只有在構造函數中讀取也沒有意義。)
可能第二個屬性沒有被自動實現了......你可以比較MSIL去確定 –
它會有什麼用處呢? –
有意義的區別是,一個嘗試自動實現集(編譯器會創建一個隱藏的變量,將無法訪問),另一個是明確無所事事,這是可以的 – Les