내 코드의 상당 부분 ( delphi-dutil 등)은 TStringDynArray
. 이제 모든 키 a TDictionary<string, string>
를 TStringDynArray
. 불행하게도 나는 단지 발견 TDictionary.Keys.ToArray
이다, TArray<T>
.
나는 원시 콘텐츠를 복사 할 수있는 간단한 복사 기능을 쓸 수 있습니다 알고 있지만, 내는 TStringDynArray
내가 변환하는 효율적인 방법을 찾고 있으므로, 보통 (약 10000 개 항목) 매우 큰 TArray<string>
에 TStringDynArray
.
function ConvertToStringDynArray(const A: TArray<string>): TStringDynArray;
var
I: Integer;
begin
assert(A <> nil);
SetLength(Result, Length(A));
for I := 0 to Length(A) - 1 do
Result[I] := A[I];
end;
가장 좋은 해결책은 코드베이스의 모든 동적 배열을 TArray<T>
. 제네릭 유형에는 훨씬 덜 엄격한 유형 호환성 규칙이 있기 때문에 이것이 가장 좋습니다. 따라서 코드베이스 전체에서이 단계를 수행하는 것이 좋습니다.
그러나 이는 사용자가 제어하는 코드에서만 실행 가능합니다. 수정할 수없는 코드 및 라이브러리와 인터페이스 할 때 문제가 있습니다.
이 모든 것의 근원에서 이러한 모든 유형은 동적 배열이며 단일의 공통 구현을 공유합니다. 이는 차단이 구현이 아닌 언어 수준에 있음을 의미합니다. 따라서 캐스트는 컴파일러가 할당을 허용하도록 안전하게 사용할 수 있습니다.
var
DynArr: TStringDynArray;
GenericArr: TArray<string>;
....
DynArr := TStringDynArray(GenericArr);
GenericArr := TArray<string>(DynArr);
함수 호출 인수에서 이러한 캐스트를 사용할 수 있습니다.
유형 검사를 억제하기 때문에 코드 전체에 이러한 캐스트를 분산시키고 싶지는 않습니다. 도우미 기능으로 중앙 집중화하십시오. 예를 들면 :
function StringDynArray(const arr: TArray<string>): TStringDynArray;
begin
Result := TStringDynArray(arr);
end;
마지막 코멘트 :이 관련 질문이 흥미로울 수 있습니다. TArray <X>를 X 배열로 형변환하는 것이 안전합니까?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다