2014-04-29 26 views
13

我已經宣佈了不少變量,是否安全,與在tarray代替XXX的陣列<XXX>

var 
    Something: array of XXX; 
begin 
    SetLength(Something, 10); 
    try 
    ... 
    finally 
    SetLength(Something, 0); 
    end; 
end; 

多大程度上是安全,讓他們代替:

var 
    Something: TArray<XXX>; 
begin 
    SetLength(Something, 10); 
    try 
    ... 
    finally 
    SetLength(Something, 0); 
    end; 
end; 
+4

請注意:您不需要使用'try' /'finally'來釋放動態數組類型的內存。它們是refcounted類型的,一旦'Something'超出範圍,內存就會自動釋放,除非它們仍然被另一個變量引用。無論哪種方式,它的行爲與你的'SetLength'長度相同。 – hvd

回答

12

正如已經回答的那樣,TArray<XXX>與定義爲array of XXX的任何其他自定義類型完全相同。實際上,TArray<XXX>定義爲array of XXX的自定義類型。

也就是說,定義爲array of XXX的定製類型是而不是在過程或函數參數的上下文中相當於array of XXX。在procedure Foo(x: array of Integer),x是一個open array parameter,它可以接受任何類型的整數數組。相比之下,procedure Foo(x: TArray<Integer>)僅需要實際的TArray<Integer>類型。嘗試傳遞固定大小的數組時,您可以看到差異,但也可以在嘗試傳遞TDynIntegerArray(另一種類型,也定義爲array of Integer)時看到差異。

因此,對於變量,當然,如果您有array of XXX,請將其更改爲TArray<XXX>。只要確保你不做全球搜索和替換。

+0

+1用於區分變量和方法參數。但是,即使對於方法參數,除非您知道並分析代碼,否則您無法爲其中一方決定。雖然您可以將'TArray '傳遞給'XXX'數組,但不能將'XXX'數組傳遞給'TArray '。因此,在某些情況下,您可能會提出「TArray 」的參數,而在其他情況下,您可能希望將其保留爲「XXX的數組」。 –

+0

我不同意第一段。這些類型不相同。它們是不同的類型,不兼容分配。 –

+0

@DavidHeffernan在第一段中,我選擇的單詞只有一個小問題。第二段有一個更大的錯誤。編輯我的答案來解決這個問題。 – hvd

5

這是完全安全去做這個。編譯器將產生相同的輸出。

我個人會在所有其他條件相同的情況下推薦這樣做。通用數組TArray<T>的使用爲您提供了更多的靈活性和更好的類型兼容性。

當然,這些好處只能用更實際的代碼才能看到,可以完成一些工作。使用通用容器時,您通常會看到好處。但是,當您嘗試使用多個不同的庫構建代碼時,您也可能會看到好處。

通用數組的使用允許簡單的類型兼容性。通用陣列之前,你會定義一個數組類型是這樣的:

TIntArray = array of Integer; 

如果兩個庫這樣做,那麼你有不兼容的類型。如果庫同意使用通用數組,那麼將會有兼容性。

爲了更清楚地看到這一點,考慮這個片段:

type 
    TIntArray1 = array of Integer; 
    TIntArray2 = array of Integer; 
.... 
var 
    arr1: TIntArray1; 
    arr2: TIntArray2; 
.... 
arr1 := arr2; 

這種分配是無效的,失敗與類型不匹配的編譯器錯誤。這在Pascal語言中完全可以預料。畢竟它是強類型的,而且它們是不同的類型。即使它們的實施完全相同。

在另一方面:

var 
    arr1: TArray<Integer>; 
    arr2: TArray<Integer>; 
.... 
arr1 := arr2; 

是有效的,並編譯。所述documentation for generic type compatibility說:

兩個實例化的泛型被認爲是兼容分配如果基類型是相同的(或者是別名爲通用類型)和類型的參數是相同的。

+1

編譯器將產生相同的輸出...除非你關心RTTI,在這種情況下,不幸的是,'TArray '可能會失敗。 (除非這個問題已經在新版本中修復?) –

+2

@MasonWheeler,確切地說! F.i. Datasnap使用的JSON封送處理可以完美地與聲明爲「數組T」的字段類型一起工作,但對於「TArray 」失敗。因此,如此常見的答案是:這取決於。 –

+0

當然這已被修復。 'TArray '是根本。 –

相關問題