这两种语法之间有什么区别?
Type
AnIntType = Integer;
AnotherIntType = Type Integer;
我注意到,第二个版本在Var/Const等过程参数中使用时不太兼容,但AnIntType和AnotherIntType不完全一样吗?
第一个声明只是类型Integer
的别名,第二个声明是基于整数的新类型,并强制编译器创建一个名为AnotherIntType
的新的不同类型
您可以在此处找到更多信息Data Types, Variables, and Constants Index (Delphi)
文档说明:
当您声明一个与现有类型相同的类型时编译器将新的类型标识符视为旧类型标识符的别名。因此,考虑到声明:
type TValue = Real; var X: Real; Y: TValue;
X和Y是相同类型的;在运行时,没有办法区分CCD_ 4和CCD_。这通常很少后果,但如果您定义新类型的目的是利用运行时类型信息,例如,用于关联属性编辑器具有特定类型的属性-"不同的名称"one_answers"不同的类型"变得很重要。在这种情况下,使用语法:
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;
现在,语言类型系统可以防止你犯这种平庸的错误,并让你继续进行真正的编程。
Andreas和Remy在对问题的评论中给出了另一个很好的例子:
TCaption
实现了一个不同的属性编辑器,允许在对象检查器中键入时进行实时更新。这是可能的,因为type TCaption = type string
。type TCaption = string
不可能做到这一点。