Pascal Delphi类型等价和类型相等语法
这两种语法有什么区别Pascal Delphi类型等价和类型相等语法,pascal,delphi,Pascal,Delphi,这两种语法有什么区别 Type AnIntType = Integer; AnotherIntType = Type Integer; 我注意到第二个版本在过程参数(如Var/Const)中使用时兼容性较差,但是一个类型和另一个类型不完全相同吗?第一个声明只是类型整数的别名,第二个声明是一个基于整数的新类型,并强制编译器创建一个名为AnotherIntType 您可以在此处找到有关以下州的更多信息: 当您声明与现有类型相同的类型时 编译器将新类型标识符视为旧类型标识符的别名。 因此,鉴
Type
AnIntType = Integer;
AnotherIntType = Type Integer;
我注意到第二个版本在过程参数(如Var/Const)中使用时兼容性较差,但是一个类型和另一个类型不完全相同吗?第一个声明只是类型
整数的别名,第二个声明是一个基于整数的新类型,并强制编译器创建一个名为AnotherIntType
您可以在此处找到有关以下州的更多信息:
当您声明与现有类型相同的类型时
编译器将新类型标识符视为旧类型标识符的别名。
因此,鉴于声明:
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;
type
HDC = type Pointer;
HWND = type Pointer;
然而,这意味着这些类型的变量可以相互分配。将HDC
传递给GetDC()
没有意义,反之亦然,将HWND
传递给ReleaseDC()
也没有意义
因此,您可以对以下类型进行处理:
type
HDC = Pointer;
HWND = Pointer;
type
HDC = type Pointer;
HWND = type Pointer;
现在,语言类型系统可以防止您犯这种平庸的错误,让您继续真正的编程
Andreas和Remy在对问题的评论中给出了另一个很好的例子:
t选项
实现了一个不同的属性编辑器,当您在对象检查器中键入时,该编辑器允许实时更新。这是可能的,因为type tcoption=type string
。这在type tcoption=string
中是不可能的
使用,卢克!。。另外,您是否注意到标题:t选项
属性(例如TForm
或TLabel
)会在设计时在控件上键入对象检查器时导致重新绘制,而常规的文本:字符串
则不会?现在,如果typetcoption=string
@David:我想你没有明白我的意思,那么这种区别是不可能的。(至少我有90%的把握。)我再给你一次机会t选项
实现了不同的属性编辑器,允许实时更新。这是可能的,因为type tcoption=type string代码>。这在类型tcoption=string时是不可能的代码>。我更喜欢这个答案,因为它指出了何时使用它。