Delphi类型等价和类型相等语法

时间:2012-01-11 16:43:51

标签: pascal delphi

这两种语法有什么区别?

Type
  AnIntType = Integer;
  AnotherIntType = Type Integer;

我注意到第二个版本在程序参数(如Var / Const)中使用时兼容性较差,但不是AnIntType和AnotherIntType完全相同吗?

2 个答案:

答案 0 :(得分:6)

第一个声明只是类型Integer的别名,第二个声明是基于整数的新类型,并强制编译器创建一个名为AnotherIntType的新的不同类型

您可以在Data Types, Variables, and Constants Index (Delphi)

找到更多信息

答案 1 :(得分:5)

documentation州:

  

当您声明一个与现有类型相同的类型时,   编译器将新类型标识符视为旧类型的别名。   因此,鉴于声明:

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;

然而,这意味着这些类型的变量可以相互分配。将HDC传递给GetDC()是没有意义的,反之亦然,将HWND传递给ReleaseDC()毫无意义。

所以你可以对这些类型进行delcare:

type
  HDC = type Pointer;
  HWND = type Pointer;

现在语言类型系统可以防止你犯这样的平庸错误,让你继续进行真正的编程。

Andreas和Remy在对问题的评论中给出了另一个很好的例子:

  

TCaption实现了一个不同的属性编辑器,允许在对象检查器中键入时进行实时更新。这可能是因为type TCaption = type stringtype TCaption = string无法做到这一点。