Delphi 如何以最优雅的方式将字符数组分配给字符串?
我喜欢Pascal的清晰性,所以相信下面的代码片段和问题标题是不言自明的:Delphi 如何以最优雅的方式将字符数组分配给字符串?,delphi,syntax,Delphi,Syntax,我喜欢Pascal的清晰性,所以相信下面的代码片段和问题标题是不言自明的: procedure TForm1.FormClick(Sender: TObject); const N = 42; { fnord } type { this structure merely defines memory layout } TStringStruct = record NumberOfCharacters: Cardinal; { this array supposed t
procedure TForm1.FormClick(Sender: TObject);
const
N = 42; { fnord }
type
{ this structure merely defines memory layout }
TStringStruct = record
NumberOfCharacters: Cardinal;
{ this array supposed to be friendly for the string type }
StringCompatibleArray: array [0..N-1] of Char;
end;
{ actual work is done with pointer to that structure }
PStringStruct = ^TStringStruct;
var
StringStruct: PStringStruct;
S: string;
begin
StringStruct := PopulatedElsewhere;
{ most pleasant code but will copy no more than N characters }
S := StringStruct^.StringCompatibleArray;
{ this construct works but is way too ugly and complex }
SetString(
S,
{ in particular: must reference the array and then typecast to make it work }
{ default $T- state assumed, unfortunately $T+ has global effect and not useful here }
PChar(@StringStruct^.StringCompatibleArray),
StringStruct^.NumberOfCharacters
);
end;
如果有人想要正式的问题:我想看看我必须执行这种分配的选项,最好比显示的SetString
call更清晰
注意:我知道什么解引用运算符对于结构化类型是可选的。
SetString
通常是一种方法。只有当人们继续对它的有用性一无所知时,它才会变得模糊不清。类型转换是必要的,因为有两个重载,并且char数组与预期的参数类型(PAnsiChar和PWideChar)都不完全匹配
它很冗长,但在您的例子中,它很容易被包装到数据类型的函数中,比如ToString
。正如David在评论中所建议的,您可以让该函数成为隐式
运算符,然后自动获得转换:
class operator TStringStruct.Implicit(const Value: TStringStruct): string;
begin
SetString(Result, Value.StringCompatibleArray, Value.NumberOfCharacters);
end;
S := StringStruct^;
看起来您正在实现一些类似Pascal字符串的东西。您可以尝试使用运算符重载。重载隐式和显式强制转换运算符。注:选民徽章做得很好!以防你不知道;您可以使用双反斜杠而不是大括号注释掉一行代码,例如“//此结构仅定义内存布局”是的,有时重载会增加复杂性,而不是解决它们。我明白你关于匹配类型的观点了,谢谢。操作符方法看起来很优雅,但你能澄清一下吗:a)类方法会干扰结构的内存布局吗?b) 我可以使用类助手之类的工具来隔离插入指令的结构吗?c) 记录运算符的最低编译器版本要求是BDS2006,对吗?类运算符和类方法一样,对类型布局绝对没有影响。它们只是普通的独立函数,但具有特殊的作用域。类助手只允许用于类,而不允许用于记录,在这里无论如何都不合适。