電腦科學中,union指的是乙個包含多種型別或者格式的值,或者資料結構包含這樣的值。一些程式語言支援特殊的資料型別——union型別。換句話說,union型別的定義,規定了哪些型別儲存在一起。比如,浮點或者長整型。相對於record型別,record型別定義為包含乙個float和乙個整型。而union則在乙個時刻只能體現一種值。
此處提及的untion型別主要指untagged unions.與之相對的是tagged unions.
由於使用上的限制,untagged union型別通常只出現型別不安全的語言,或者以一種不安全的方法使用(c中)。對於tagged union型別來說,他們的優勢在於不需要空間來儲存tag。
union和structure的區別
從記憶體的角度來說,union就是乙個類,只不過,它所包含的所以的資料成員都在同乙個位址上。因此union物件的大小就是它所包含的資料型別中最大的那個。
而結構,所有的成員儲存在連續的記憶體位址上,結構的大小就是所有成員型別大小的和。
在某些場合下,為了更有效的利用記憶體空間,程式邏輯必須確保讀取的值是最新寫的值。不然轉型的時候可能會有異常丟擲。下圖是乙個結構和union的記憶體分配示意圖:
+-----+-----+結構主要用在在當物件有多個物件組成,比如由2個整型組成,比如下面的x,y是並列的。struct
gives | a | b |
+-----+-----+^^
||memory location:
150154
| v
+-----+
union
gives | a |
| b |
+-----+
typedef struct tpoint;
union則用於乙個物件可以是任何型別,但是同一時間只能是一種型別,就和type-less儲存系統那樣。
typedef enum ttype;
typedef struct
} tval;
tagged union,也稱作variant, variant record, discriminated union。tagged union和untagged union一樣,也是一種資料型別,它可以接受多種不同的,但是固定的型別。同時間只有一種型別可以使用。tag 欄位顯式的表明哪乙個在使用。可以認為是乙個帶有幾個"case"的型別。當操作這種型別是,每乙個case都要正確的處理。和普通的union型別一樣,tagged union也是每個型別重疊使用儲存區域。
tagged union在函式式語言中諸如ml和haskell中是一種重要的型別,有時也稱做變體,編譯器能驗證tagged union中的所有的case,避免型別錯誤。tagged union通常和constructor這個概念一起出現。此處constructor不是指類的構造器。constructor生成 tagged union的值,初始化tag值。
tagged union對於untagged union的優勢在於訪問tagged union是安全的。untagged union依靠程式邏輯來保證訪問是安全的。tagged unions的缺點就是tag需要佔據空間。
typescript 交叉型別和聯合型別
1.1 交叉型別 inte ce doninte ce inte ce catinte ce 這裡的pet將兩個型別合併,所以pet必須保護兩個型別所定義的方法 let pet doninte ce catinte ce jump function 1.2 聯合型別 let a number str...
TS之型別推論 聯合型別 型別斷言
ts中,沒有明確指出型別的地方,型別推論會幫助提供型別。如下面的例子 let x 3這裡的x就被推斷為數字,這種推斷發生在初始化變數和成員,設定預設引數值和決定引數返回值時。如果要從幾個表示式中推斷型別的時候,會使用這些表示式的型別來推斷出乙個最合適的通用型別。例如 let x 0,1,null 為...
TypeScript中的聯合型別
1 聯合型別表示取值可以為多種型別的一種。2 如果定義的時候沒有賦值,不管之後有沒有賦值,都會被推斷成any型別而完全不被型別檢查。聯合型別 var type string number boolean 1 type 12 type true 3 只能訪問此聯合型別的所有型別裡共有的屬性和方法。va...