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

az0*_*z01 3 delphi pascal

这两种语法有什么区别?

Type
  AnIntType = Integer;
  AnotherIntType = Type Integer;
Run Code Online (Sandbox Code Playgroud)

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

RRU*_*RUZ 6

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

您可以在此处找到更多信息 Data Types, Variables, and Constants Index (Delphi)


Dav*_*nan 5

文件规定:

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

type TValue = Real;
var
  X: Real;
  Y: TValue;
Run Code Online (Sandbox Code Playgroud)

X和Y属于同一类型; 在运行时,有没有办法区分TValueReal.这通常没什么影响,但是如果您定义新类型的目的是利用运行时类型信息,例如,将属性编辑器与特定类型的属性相关联 - "不同名称"和"不同类型"之间的区别变得重要.在这种情况下,请使用以下语法:

type newTypeName = type KnownType
Run Code Online (Sandbox Code Playgroud)

例如:

type TValue = type Real;
Run Code Online (Sandbox Code Playgroud)

强制编译器创建一个名为的新的不同类型TValue.

需要创建不同的类型而不是别名并不是非常普遍.但是,偶尔会有用途.我能想到的最好的例子是考虑Windows类型HDCHWND.这些都是指针大小的不透明值.所以似乎合理地定义它们是这样的:

type
  HDC = Pointer;
  HWND = Pointer;
Run Code Online (Sandbox Code Playgroud)

但是,这意味着这些类型的变量可以相互分配.这是没有意义的一个传递HDCGetDC()和,反之亦然,这是没有意义的传递和HWNDReleaseDC().

所以你可以delcare这样的类型:

type
  HDC = type Pointer;
  HWND = type Pointer;
Run Code Online (Sandbox Code Playgroud)

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

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

TCaption当您在对象检查器中键入时,实现了一个不同的属性编辑器,允许实时更新.这是可能的,因为type TCaption = type string.这是不可能的type TCaption = string.