2012-01-11 61 views
3

這兩種語法有什麼區別?Delphi類型等價和類型相等的語法

Type 
    AnIntType = Integer; 
    AnotherIntType = Type Integer; 

我注意到,當它在程序參數,如VAR /常量的二手第二個版本是不太兼容,但不AnIntType和AnotherIntType一模一樣?

+3

使用[man](Luke!)(http://docwiki.embarcadero.com/RADStudio/XE/en/Declaring_Types),Luke! – OnTheFly 2012-01-11 16:51:31

+0

..also [類型兼容性和標識](http://docwiki.embarcadero.com/RADStudio/en/Type_Compatibility_and_Identity) – 2012-01-11 17:22:08

+1

你有沒有注意到一個'Caption:TCaption'屬性('TForm'或'TLabel' ,比如說)會在設計時在對象檢查器中鍵入時導致對控件重繪,而常規的'Text:string'不會?現在,如果'type TCaption = string',這種區別是不可能的。 – 2012-01-11 21:39:11

回答

4

documentation狀態:

在聲明類型,對於與現有類型, 編譯器將新的典型e標識符作爲舊標識符的別名。 因此,給定的聲明:

type TValue = Real; 
var 
    X: Real; 
    Y: TValue; 

X和Y是相同類型的;在運行時,沒有辦法 區分TValueReal。這通常具有很小的後果,但是如果您定義新類型的目的是利用運行時類型信息(例如,將屬性編輯器 與特定類型的屬性 - 「不同名稱」和'不同類型'變得重要。在這種情況下, 使用語法:

type newTypeName = type KnownType 

例如:

type TValue = type Real; 

強制編譯器創建一個新的,不同的類型,稱爲TValue

需要創建一個獨特的類型而不是一個別名是不是很常見。但是,有偶爾的用途。我能想到的最好的例子是考慮Windows類型HDCHWND。這些都是指針大小的不透明值。因此,它似乎合理地定義它們是這樣的:

type 
    HDC = Pointer; 
    HWND = Pointer; 

然而,這意味着,這些類型的變量分配給對方。通過HDCGetDC()是沒有意義的,反之亦然,通過HWNDReleaseDC()是沒有意義的。

所以,你可以delcare類型是這樣的:

type 
    HDC = type Pointer; 
    HWND = type Pointer; 

現在的語言類型系統可以防止你這種陳腐的錯誤,並讓你與真正的編程。

另一個很好的例子是由安德烈亞斯和雷米在評論的問題給出:

TCaption有不同的屬性編輯器中實現,允許實時更新,爲您在Object Inspector類型。這可能是因爲type TCaption = type string。這是不可能的,type TCaption = string

+1

我喜歡這個答案比接受的更好,因爲它指出何時使用它。 – 2012-01-11 23:37:16