这两种语法有什么区别?Delphi类型等价和类型相等的语法
Type
AnIntType = Integer;
AnotherIntType = Type Integer;
我注意到,当它在程序参数,如VAR /常量的二手第二个版本是不太兼容,但不AnIntType和AnotherIntType一模一样?
这两种语法有什么区别?Delphi类型等价和类型相等的语法
Type
AnIntType = Integer;
AnotherIntType = Type Integer;
我注意到,当它在程序参数,如VAR /常量的二手第二个版本是不太兼容,但不AnIntType和AnotherIntType一模一样?
第一个声明只是为类型Integer
的别名,第二个声明是基于一个整数,并强制编译新的类型来创建一个新的不同的类型,称为AnotherIntType
你可以在这里找到更多的信息Data Types, Variables, and Constants Index (Delphi)
的documentation状态:
在声明类型,对于与现有类型, 编译器将新的典型e标识符作为旧标识符的别名。 因此,给定的声明:
type TValue = Real; var X: Real; Y: TValue;
X和Y是相同类型的;在运行时,没有办法 区分
TValue
从Real
。这通常具有很小的后果,但是如果您定义新类型的目的是利用运行时类型信息(例如,将属性编辑器 与特定类型的属性 - “不同名称”和'不同类型'变得重要。在这种情况下, 使用语法:type newTypeName = type KnownType
例如:
type TValue = type Real;
强制编译器创建一个新的,不同的类型,称为
TValue
。
需要创建一个独特的类型而不是一个别名是不是很常见。但是,有偶尔的用途。我能想到的最好的例子是考虑Windows类型HDC
和HWND
。这些都是指针大小的不透明值。因此,它似乎合理地定义它们是这样的:
type
HDC = Pointer;
HWND = Pointer;
然而,这意味着,这些类型的变量分配给对方。通过HDC
到GetDC()
是没有意义的,反之亦然,通过HWND
到ReleaseDC()
是没有意义的。
所以,你可以delcare类型是这样的:
type
HDC = type Pointer;
HWND = type Pointer;
现在的语言类型系统可以防止你这种陈腐的错误,并让你与真正的编程。
另一个很好的例子是由安德烈亚斯和雷米在评论的问题给出:
TCaption
有不同的属性编辑器中实现,允许实时更新,为您在Object Inspector类型。这可能是因为type TCaption = type string
。这是不可能的,type TCaption = string
。
我喜欢这个答案比接受的更好,因为它指出何时使用它。 – 2012-01-11 23:37:16
使用[man](Luke!)(http://docwiki.embarcadero.com/RADStudio/XE/en/Declaring_Types),Luke! – OnTheFly 2012-01-11 16:51:31
..also [类型兼容性和标识](http://docwiki.embarcadero.com/RADStudio/en/Type_Compatibility_and_Identity) – 2012-01-11 17:22:08
你有没有注意到一个'Caption:TCaption'属性('TForm'或'TLabel' ,比如说)会在设计时在对象检查器中键入时导致对控件重绘,而常规的'Text:string'不会?现在,如果'type TCaption = string',这种区别是不可能的。 – 2012-01-11 21:39:11