C#中不可變類型和不可變屬性的含義是什麼?你能舉個簡單的例子嗎?C#中的不可變類型和屬性#
回答
一個不可變型是一種類型的,其中它的屬性只能在初始化時被設置。一旦創建了一個對象,什麼都不能改變。一個不可變屬性只是一個只讀屬性。
在以下示例中,ImmutableType
是不可變類型,其中一個屬性爲Test
。測試是隻讀屬性。它只能在施工中設置。
class ImmutableType
{
private readonly string _test;
public string Test
{
get { return _test; }
}
public ImmutableType(string test)
{
_test = test;
}
}
也參見:The Wikipedia article,並且some StackOverflow questions的話題。
fretje是正確的。最流行的不可變類型的示例是C#中的string
對象。這是StringBuilder
存在的全部原因。
除了上面的@ fretje的回答,在C#6和更高版本中,getter-only auto properties現在已經實現,它允許不變的自動屬性,而不需要額外的顯式private readonly
支持字段。等效代碼將被縮寫爲:
class ImmutableType
{
public string Test
{
get; // No Set at all, not even a private set.
}
public ImmutableType(string test)
{
Test = test; // The compiler understands this and initializes the backing field
}
}
注意private set
(最接近不變性能得到早期版本的C#中使用自動屬性)只能從同一類中提供了變化的限制封裝的財產,因而不是真正一成不變:
public string Test
{
get;
private set; // Not immutable, since this is still mutable from within the class
}
更多關於永恆
正如其他人所說,一個immutable Property
是一個屬性一旦設置就不能改變。 「唯一值」的設置通常在構造函數中完成。
immutable Type
是一種所有(外部可見)屬性和字段都是不可變的類型 - 例如最初爲C#7 (hopefully now 8)計劃的「記錄」類型本來就是不可變的類型。其他不可變類型的例子是Tuples
,以及全部anonymous classes。
不可變字段應該與C#中的readonly
關鍵字限定 - 這是由編譯器執行,以確保沒有其他代碼試圖改變的構造以外的領域。
只要有可能,字段,變量和屬性的不變性被認爲是好的做法,因爲這大大減少了bug的表面積(因爲字段代表對象的狀態,防止字段的改變減少了狀態的數量)。
不變性的好處是特別重要的多線程程序,其中兩個或多個線程同時訪問同一個對象。由於多個併發讀取線程可以安全地訪問字段或屬性的值,因此程序員無需擔心與其他線程更改字段有關的線程安全問題。
不變性的一個共同的缺點與由多個組成物體的複雜對象處理時,是整個圖形需要「一次性」,這可導致凌亂的代碼來構建。這裏常見的解決方案是使用Builder pattern作爲腳手架,它允許在步驟中構建瞬態的可變表示,然後在最後的.Build()
步驟中獲得最終的不變對象。
- 1. C#可爲空類型和值屬性
- 2. 不一致的可訪問性:類中的屬性類型比接口中的屬性類型不易訪問
- 3. 可空類型和屬性INotifyPropertyChanged的
- 4. Objective-C屬性的類型
- 5. 流聯合類型和可選屬性
- 6. PFUbiquityRecordsImporter - 屬性的值不可接受的類型:屬性
- 7. 作爲配置屬性的不可變類型
- 8. 值類型的可變性
- 9. .NET中的值類型,不變性(良好)和可變性(邪惡)
- 10. C#屬性引用類型?
- 11. C#未知類型屬性
- 12. 改變繼承類的屬性類型
- 13. 屬性值不可接受的類型,但類型是好的
- 14. C#UserControl可見屬性不變
- 15. 如何在c#中訪問屬性屬性中的類變量?
- 16. 如何讓類屬性不可變?
- 17. 與屬性不可變類積聚
- 18. C++中不可變的類
- 19. C++類模板的屬性類型
- 20. XSD - 可以改變屬性類型的擴展型
- 21. 可變類型'NSMutableDictionary'的屬性具有'copy'屬性;一個不可變對象將代替
- 22. 不可改變的屬性
- 23. 可變屬性的螞蟻不可變屬性
- 24. C#泛型類中的協變性
- 25. C#中沒有「屬性類型」的屬性
- 26. 我可以在C中找到變量所屬的類型嗎?
- 27. Gradle中的不同類型的屬性?
- 28. C中可見性的系統類型#
- 29. webservices和屬性類型
- 30. 具有可變大小和可變類型的C++容器
您可以通過以只讀方式爲_test加前綴來針對將來的類更改實施不變性。唉,可悲的是在C#中沒有不可變的自動實現的屬性。 – 2010-03-29 12:03:47
@Sam:謝謝,更新了這個例子。 – fretje 2010-03-29 12:07:50
當你的屬性是引用類型時,這會有點棘手。那麼,不可變定義的定義可以被解釋爲*引用*是不可變的,或者*對象圖*是不可變的(取決於您的需要,但通常它是後者 - 請參閱Wiki文章)。 – 2010-03-29 12:24:34