7.1.2 c# 中的函式式資料結構
我們已經在 c# 中實現了幾個函式式的不可變資料型別,比如 funclist 或元組。在 c# 中,我們會通過寫一類特定的方式實現。最重要的是,所有屬性必須是不可變的。這可以通過使用唯讀字段,或者通過宣告私有的 setter 屬性,只在類的建構函式中設定。在清單 7.3 中,我們使用第一種方法來實現似於類清單 7.1 中的 rect 型別的類。
listing 7.3 immutable rect type (c#)
public sealed class rect }
public float top }
public float width }
public float height }
public rect(float left, float top, float width, float height)
public rect withleft(float left)
// todo: withtop, withwidth and withheight
}這個類包含的字段,在建構函式中使用唯讀修飾符標記進行初始化。這是在 c# 中實現真正不可變類或值的正確的方法。也可以使用 c# 3.0 的自動屬性與私有的 setter。那樣,你的責任是確保僅在建構函式中設定屬性,它使**稍短。
更有趣的地方是 withleft 方法,這可以用來建立修改後的 left 屬性值的轉殖物件。我們省略掉其他屬性類似的方法,因為,它們都很容易實現。這些方法對應於我們前面看過的 f# 記錄的 with 關鍵字。你自己可以看到這個相似性:
let moved =
var moved = rc.withleft(10.0f);
最重要的一點是,我們不需要顯式讀取 rect 類的所有屬性,和我們剛才提到的想要更改的屬性。此語法是很優雅,即使我們想要修改屬性不止乙個:
var moved = rc.withleft(10.0f).withtop(10.0f);
正如我們在此示例中看到的,經常需要同時設定兩個相關的屬性。如果經常發生這種情況,更方便的是,新增乙個新的方法以建立轉殖,並修改所有相關的屬性。在我們的示例中,我們也可以新增方法,withposition 和 withsize,因為,它們代表共同的操作。這可能也是必需的,如果每個單獨的改變會建立物件處在無效狀態,而組合的操作表示有效的狀態轉換。
這就是我們現在需要了解 f# 的記錄型別。我們將在第 9 章回到 .net 中的函式式資料型別。在下一節中,我們將開始繼續乙個更大的示例應用程式,這是這一章的核心,我們將討論通常表示程式資料的方式。
7 1 2 C 中的函式式資料結構
7.1.2 c 中的函式式資料結構 我們曾經用 c 實現過幾個函式式不可變資料型別,比如 funclist 或元組。在 c 中,是通過以特殊方式寫類來實現的,最重要的是,所有屬性必須是不可變的,這是通過使用唯讀字段,或者通過宣告的屬性具有私有的 setter,且只在類的建構函式中設定來實現。在清單 ...
7 1 函式式資料結構
7.1 函式式資料結構 用函式程式設計,程式處理的資料總是儲存在資料結構中。資料結構和物件之間的區別在於,資料結構公開了表示資料 從名字就可以知道 的結構 知道了資料的結構便於寫處理的 但要到第九章才討論,f 還提供了一種封裝結構的方法,如同物件導向程式設計,當我們想從庫中匯出 f 資料結構,或者用...
C 基礎 C 中的資料結構
陣列具有以下的特點 陣列屬於線性結構,在記憶體中是連續存放的。陣列的元素型別必須相同。陣列可以直接通過下標訪問。陣列的查詢速度非常快,新增和刪除速度慢。陣列在初始化時要指定陣列長度。動態陣列具有以下的特點 arraylist的底層其實就是乙個陣列。arraylist在宣告時不必指定長度,會根據儲存的...