Delphi 的Record結構體
一直以來對帶case的Record只會用而不求甚解。知道他類似於c語言的union。今天詳細看了help。瞭解一下。汗~啊。先對自己內心進行下自我批評~~~~
下面是偶的新體會。
1. 首先了解到record是可以限制field的範圍的,而且定義列舉型別的。
type TDateRec = record
Year: Integer;
Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Day: 1..31;
end;
2. 可以在不定義結構體的情況下,直接在變數宣告時使用。
var S: record
Name: string;
Age: Integer;
end;
3. 下面是變體部分,這是Delphi中變體在結構中的標準定義
type recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
case tag: ordinalType of
constantList1: (variant1);
...
constantListn: (variantn);
end;
Ø Tag可以省略
Ø constantList的型別和ordinalType的型別一致
Ø fieldList的型別不能是long strings, dynamic arrays, variants,也不能是包含這些的結 構體,但可以是指向這些型別的指標
Ø Tag和constantLists 在編譯器處理這些欄位時沒有用,只是為程式設計師理解時提供方便 (原文:The optional tag and the constantLists play no role in the way the compiler manages the fields; they are there only for the convenience of the programmer.)
Ø 使用變體結構體的兩個原因:一個是需要不同的資料,但是又不會同時需要所有的欄位。
type TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
Ø 另一個原因是可以把同樣的資料就像是不同的型別的資料。比如,你有一個64位的實數做為第一個欄位,你就可以把它的高32位作為整數返回。這是Delphi幫助裡說的。不太好看出來,而且Real到Interger的轉換我也很少用。弄個Word到Byte的結構到時很常用。
Type
RConversion = record
Case Boolean of
True : (aWord: Word;);
False : (abyte bbyte : Byte;);
end;
這裡附加一句觀點,我和周圍的同事認為這樣的結構體會造成程式碼的易讀性降低,一般在自己的程式碼中不建議使用,當然為相容Windows的一些結構除外,他本來就是union當然用這樣的直接套用就可以了。
結構體的基本應用就是這樣的。還有一些特殊的應用,比如“class-like”的結構體,和file of record。
Class-like的結構體我不知道什麼時候使用,既然需要Create,用類不就得了。下面有篇文章對原理有一些闡述http://blog.csdn.net/maozefa/archive/2007/08/27/1760612.aspx。
File of record,個人比較喜歡,特別是在記錄某種資料的時候,經常是把一個結構體整個寫入到檔案裡,既實現了一定程度的加密,又簡單方便,讀出來也可以直接放進結構體裡。這裡就不詳細描述了。