tarray<string>和array of string完全一样,两个类型的变量可以直接互相赋值也可以直接写在参数里 tstringlist与tarray<string>的相互转换 c := tstringlist.create; c.addstrings(a); //copy a to c a := c.tostringarray; //copy c to a
tlist<string>与Tarray<string>的相互转换 d := TList<string>.Create(a); //copy a to d a := d.ToArray; //copy d to a
tlist<string>与TStringList的相互转换 d := TList<string>.Create(c); //copy c to d c := TStringList.Create; c.AddStrings(d.ToArray); //copy d to c
----------------------------------------------
-
tarray<string>和array of string用法一样,但不能copy,也不能直接互相赋值,参数也不能相互替代。 var TS:TArray<string>; Arr:array of string; begin for var i := 0 to 99 do TS:=TS+[i.ToString]; SetLength(Arr,100); Move(TS[0],Arr[0],Length(TS)*4); for var i := 0 to 99 do Memo1.Lines.Add(Arr[i]); end;
----------------------------------------------
-
Move在知道String数组长度的时候可用,string数组是不定长的,因此用起来也不方便。 用泛型copy是比较好的解决方案: uses System.Generics.Collections; var TS:TArray<string>; Arr:array of string; begin for var i := 0 to 99 do TS:=TS+[i.ToString]; SetLength(Arr,100); TArray.Copy<String>(TS,Arr,100); end;
----------------------------------------------
-
@hs_kill 谢谢 我是11.2试了一下 函数形参是array of string的时候传入array of string或者tarray<string>都可以 函数形参是tarray<string>的时候传入array of string不行 如果定义了2个变量 分别是array of string 如果都在函数内部定义是可以互相赋值的 如果一个是形参一个是实参就会提示'不兼容的类型,Dynmic array和array of string'
B := A; 这里仅仅是把 A 的指针给了 B,原来的那个字符串只是多了一个引用。没有另外分配空间,复制字符串。
但是,如果是:
A := 'abcd'; B := A; A := '1234'; 《--- 到这里,因为 A 的内容被改了,但 B 仍然是以前的内容 abcd,因此,这里新分配了空间。分配空间比较消耗 CPU。
关于分配空间比较消耗 CPU 这个事情,不管是 Delphi 还是 C,都有一个技巧,就是预先分配一个比较大的空间。比如以下代码:
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin List.Capacity := 100; //如果没有这行代码,那么,每次 add 可能都要重新分配空间。这行代码就预先分配足够空间。 List := TStringList.Create; for i := 0 to 99 do begin List.Add(i.ToString); end; end;
再说 TArray<string>,看看 Delphi 自己的代码: function TStrings.ToStringArray: TArray<string>; var I: Integer; begin SetLength(Result, Count); for I := 0 to Count - 1 do Result[I] := Strings[I]; end;
for var i := 0 to 99 do TS:=TS+[i.ToString]; SetLength(Arr,100);
对于这段代码, 如果不想用list, 可以这样写 setlength(TS, 100) for var i := 0 to 99 do TS[i]:= i.ToString; 这样只有最开始分配了一次内存, 后面都是指针引用
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/