当前位置 : 主页 > 编程语言 > delphi >

数组 – 在Delphi中定义记录 – (记录为类型vs记录为变量) – 差异,缺点和优点…

来源:互联网 收集:自由互联 发布时间:2021-06-23
我一直在研究Delphi中的记录,在大多数情况下我看到它们用作Type,然后声明它的一个新变量,例如: type TMyRecord = record data1: sometype; data2: sometype; end;var OnesRecord: TMyRecord; 对于数组,它也用作
我一直在研究Delphi中的记录,在大多数情况下我看到它们用作Type,然后声明它的一个新变量,例如:

type
  TMyRecord = record
    data1: sometype;
    data2: sometype;
  end;

var
  OnesRecord: TMyRecord;

对于数组,它也用作:

type
  TMyRecord = record
    data1: sometype;
    data2: sometype;
  end;

var
  OnesRecord: array of TMyRecord;

我的问题如下:

为什么不应该使用第一种方法用于数组,方式如下:

type
  TMyRecord = array of record
    data1: sometype;
    data2: sometype;
  end;

var
  OnesRecord: TMyRecord;

另外,如果使用直接定义为变量的记录,例如:

var
  OnesRecord: record
    data1: sometype;
    data2: sometype;
  end;

要么

var
  OnesRecord: array of record
    data1: sometype;
    data2: sometype;
  end;

最后一件事;如果要合并第二种和第三种方法,并且具有该类型的数组类型和该类型的数组的变量,它是否与具有数组的数组有什么不同?

那么,是这样的:

type
  TMyRecord = array of record
    data1: sometype;
    data2: sometype;
  end;

var
  OnesRecord: array of TMyRecord;

与此不同的是:

type
  TMyRecord = record
    data1: sometype;
    data2: sometype;
  end;

var
  OnesRecord: array of array of TMyRecord;
做你正在做的事情没什么不对,就像没有什么能阻止你重载Add()运算符来做乘法.

你的问题完全是理论上的,因此很难用这种或那种方式说出来.是的,这些结构是“合法的”.所以呢?

这就像在你发现你可以走在你的手上之后询问走路而不是走路.

在所有情况下的问题是相同的……你为什么要这样做?

而不是询问“合法”但没有人使用的编码方法,为什么不尝试展示这样的用途被证明是有利的例子?

从理论的角度来看,您正试图混合两种不同的数据聚合机制.

数组是一种收集相同类型项目的方法.记录和类是收集不同类型的相关项目的一种方式.它们都是各种容器,但它们具有不同的特性.

您通常将数组声明为“数组”而不是“数组记录…结束”.

按照惯例,您将记录定义为TYPE,以便您可以“重用”该类型.

你显然没有太多的经验,因为你不能在非常狭窄的环境之外使用这些结构.

假设您要定义类似“整数数组”的内容;您可以将其定义为特定类型:

type
 TIntArray = array of integer;

你为什么要这样做?因为有时你会发现声明两个不同的东西都是“整数数组”使它们不兼容类型,这是违反直觉的.

但是如果它们都被声明为TIntArray,那么编译器会接受它.

我不知道这是否是正确的术语,但就编译器而言,“myvar:”和“myvar:”之间存在差异.在这种情况下,将是“TIntArray”,并且将是“整数数组”.

var
  myvar1 : array of integer;
  myvar2 : TIntArray;

这两个在所有情况下都不兼容.此外,

procedure myproc( AVar : array of integer )

不接受myproc(myvar2),因为myvar2不是“整数数组”类型.真!它的类型为TIntArray.看到不同?

现在用任何类型的“记录……结束”,甚至你的“记录…结束”事件取代该声明,你开始看到你所要求的限制.是的,编译器消化它就好了.它只是不允许你作为匹配该类型的参数传递任何东西!即使他们“看起来”完全一样,不管你信不信.

所以,为了回答你自己的问题,我挑战你构建一个非平凡的例子,你提出的事情实际上是有意义的,编译器接受它们.因为虽然编译器可能接受您在上面创建的孤立示例,但它们在实践中不太可能工作得很好(如果有的话).

但是,当你提出一个富有洞察力的问题时,你会得到Audacity的’A’!

网友评论