Array of MyType
レガシーDelphiアプリケーションをDelphi-XE2に移行していますが、として定義されているアレイを置き換える正当な理由があるかどうか疑問に思っていますTArray<MyType>
。TArray<T>
だから問題は、MyTypeの配列の代わりに使用法の長所と短所は何ですか?
3 に答える
主な利点は、面倒なタイプ ID ルールが少ないことです。検討:
a: array of Integer;
b: array of Integer;
これら 2 つの変数は代入互換性がありません。次のように書くとコンパイラ エラーになります。
a := b;
一方、一般的な構文を使用する場合:
a: TArray<Integer>;
b: TArray<Integer>;
この場合、これら 2 つの変数は代入互換です。
確かに、あなたは書くことができます
type
TIntegerArray = array of Integer;
ただし、すべての関係者が同じタイプに同意する必要があります。すべてのコードが自分の管理下にある場合は問題ありませんが、さまざまなソースからのコードを使用する場合、ジェネリック動的配列の出現によって大きな違いが生じます。
同様に思いつくもう 1 つの利点は、ジェネリック配列型をジェネリック メソッドの戻り値の型として簡単に使用できることです。
ジェネリック配列がないと、次の形式の型を宣言する必要があります。
TArrayOfT = array of T
あなたのジェネリッククラスでは、かなり面倒です。また、非ジェネリック クラスでジェネリック メソッドを記述している場合、その宣言を行う方法はありません。ここでも、ジェネリック配列が問題を解決します。
TMyClass = class
class function Foo<T>: TArray<T>; static;
end;
これはすべて、次のようなドキュメントで説明されている型の互換性ルールに従います。
タイプの互換性
インスタンス化されていない 2 つのジェネリックは、それらが同一であるか、共通の型のエイリアスである場合にのみ、代入互換性があると見なされます。
2 つのインスタンス化されたジェネリックは、基本型が同一 (または共通型のエイリアス) であり、型引数が同一である場合、代入互換性があると見なされます。
TArray<T>
1 つのコンストラクトで値を初期化できます。
var
LArray: TArray<Integer>;
begin
LArray := TArray<Integer>.Create(1, 2, 3, 4);
あなたはarray of Integer
もっと多くのコードを書く必要があるでしょう:
var
LArray: array of Integer;
begin
SetLength(LArray, 4);
LArray[0] := 1;
LArray[1] := 2;
LArray[2] := 3;
LArray[3] := 4;
関数の結果に役立ちます。
例:
以下は、Delphi では許可されていません。ここで別の型を宣言する必要があります。時間の無駄です。
function MyFunc:array of integer;
begin
end;
待って、resque のジェネリック:
function MyFunc:TArray<integer>;
begin
end;