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时是不可能的。我更喜欢这个答案,因为它指出了何时使用它。