2012-01-11 34 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