web-dev-qa-db-ja.com

Tの配列の代わりにTArray <T>を使用する理由は何ですか?

レガシーのDelphiアプリケーションをDelphi-XE2に移行しています。Array of MyTypeとして定義されている配列をTArray<MyType>に置き換えるのに十分な理由があるかどうか疑問に思っています。それで問題は、Array of MyTypeの代わりにTArray<T>の使用の長所と短所は何ですか?

31
Salvador

主な利点は、それほど煩わしくないタイプのアイデンティティルールです。検討してください:

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;

これはすべて documentation に記述されている型互換性ルールに次のように続きます:

タイプの互換性

2つのインスタンス化されていないジェネリックが同一であるか、共通の型のエイリアスである場合にのみ、割り当て互換と見なされます。

2つのインスタンス化されたジェネリックは、基本型が同一(または共通の型のエイリアス)であり、型引数が同一である場合、割り当て互換と見なされます。

33
David Heffernan

初期化できます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;
19
Linas

関数の結果に便利です。

例:

Delphiでは以下は許可されていません。ここで別の型を宣言する必要があります。時間の無駄だ。

function MyFunc:array of integer; 
begin
end;

待って、resqueのジェネリック:

function MyFunc:TArray<integer>;
begin
end;