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’!