为什么通用 TArray Create 语法与其他 class 函数不同?
Why does generic TArray Create syntax differs from other class functions?
我注意到一些在我看来是通用 TArray
语法中的不一致之处(让我抓狂...)
调用"constructor"函数需要在函数名前指定类型。
MyArray := TArray<Integer>.Create(3, 2, 1);
其他class函数需要在函数名
后指定类型调用
TArray.Sort<Integer>(MyArray);
他们这样做有实际原因吗?
第一个TArray
是array of T
的系统类型定义。创作也可以这样写:
MyArray := [3,2,1];
第二个 TArray
是 Generics.Collections 中定义的 class。
他们没有任何关系。
另请注意,TArray
class 使用泛型的方式称为 Parameterized Methods。
Type
TArray = class
...
class procedure Sort<T>(var Values: array of T); overload; static;
...
end;
这是一种减少代码重复的方法。
泛型数组是这样定义的
TArray<T> = array of T;
这是动态数组的别名。动态数组有一个内在的 Create
方法。甚至是非通用的。
type
TMyDynArr = array of Integer;
....
arr := TMyDynArr.Create(0, 1, 2);
此Create
方法是编译器固有的。注意它如何接受任意数量的参数。
另一方面,有 class TArray
,它具有通用的 Sort
方法。这是在 RTL 中实现的。请记住 TArray
永远不会实例化,它只是通用 class 方法的集合。
我的猜测是,向动态数组类型添加方法需要编译器支持,因为它们是内部函数。但是添加到 TArray
更简单,因为它是在 RTL 层完成的,不需要编译器支持。
在这里您无能为力,因此为此烦恼也无济于事。你无法改变它。习惯就好了。
我注意到一些在我看来是通用 TArray
语法中的不一致之处(让我抓狂...)
调用"constructor"函数需要在函数名前指定类型。
MyArray := TArray<Integer>.Create(3, 2, 1);
其他class函数需要在函数名
后指定类型调用TArray.Sort<Integer>(MyArray);
他们这样做有实际原因吗?
第一个TArray
是array of T
的系统类型定义。创作也可以这样写:
MyArray := [3,2,1];
第二个 TArray
是 Generics.Collections 中定义的 class。
他们没有任何关系。
另请注意,TArray
class 使用泛型的方式称为 Parameterized Methods。
Type
TArray = class
...
class procedure Sort<T>(var Values: array of T); overload; static;
...
end;
这是一种减少代码重复的方法。
泛型数组是这样定义的
TArray<T> = array of T;
这是动态数组的别名。动态数组有一个内在的 Create
方法。甚至是非通用的。
type
TMyDynArr = array of Integer;
....
arr := TMyDynArr.Create(0, 1, 2);
此Create
方法是编译器固有的。注意它如何接受任意数量的参数。
另一方面,有 class TArray
,它具有通用的 Sort
方法。这是在 RTL 中实现的。请记住 TArray
永远不会实例化,它只是通用 class 方法的集合。
我的猜测是,向动态数组类型添加方法需要编译器支持,因为它们是内部函数。但是添加到 TArray
更简单,因为它是在 RTL 层完成的,不需要编译器支持。
在这里您无能为力,因此为此烦恼也无济于事。你无法改变它。习惯就好了。