这两种语法有什么区别?
Type
AnIntType = Integer;
AnotherIntType = Type Integer;
Run Code Online (Sandbox Code Playgroud)
我注意到第二个版本在程序参数(如Var/Const)中使用时兼容性较差,但不是AnIntType和AnotherIntType完全相同吗?
第一个声明只是类型的别名Integer,第二个声明是基于整数的新类型,并强制编译器创建一个名为new的新类型AnotherIntType
您可以在此处找到更多信息 Data Types, Variables, and Constants Index (Delphi)
该文件规定:
声明与现有类型相同的类型时,编译器会将新类型标识符视为旧类型的别名.因此,鉴于声明:
Run Code Online (Sandbox Code Playgroud)type TValue = Real; var X: Real; Y: TValue;X和Y属于同一类型; 在运行时,有没有办法区分
TValue从Real.这通常没什么影响,但是如果您定义新类型的目的是利用运行时类型信息,例如,将属性编辑器与特定类型的属性相关联 - "不同名称"和"不同类型"之间的区别变得重要.在这种情况下,请使用以下语法:Run Code Online (Sandbox Code Playgroud)type newTypeName = type KnownType例如:
Run Code Online (Sandbox Code Playgroud)type TValue = type Real;强制编译器创建一个名为的新的不同类型
TValue.
需要创建不同的类型而不是别名并不是非常普遍.但是,偶尔会有用途.我能想到的最好的例子是考虑Windows类型HDC和HWND.这些都是指针大小的不透明值.所以似乎合理地定义它们是这样的:
type
HDC = Pointer;
HWND = Pointer;
Run Code Online (Sandbox Code Playgroud)
但是,这意味着这些类型的变量可以相互分配.这是没有意义的一个传递HDC到GetDC()和,反之亦然,这是没有意义的传递和HWND到ReleaseDC().
所以你可以delcare这样的类型:
type
HDC = type Pointer;
HWND = type Pointer;
Run Code Online (Sandbox Code Playgroud)
现在,语言类型系统可以防止你犯这样的平庸错误,让你继续进行真正的编程.
Andreas和Remy在对该问题的评论中给出了另一个很好的例子:
TCaption当您在对象检查器中键入时,实现了一个不同的属性编辑器,允许实时更新.这是可能的,因为type TCaption = type string.这是不可能的type TCaption = string.
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |