Delphi 如何以最优雅的方式将字符数组分配给字符串?

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

我喜欢Pascal的清晰性,所以相信下面的代码片段和问题标题是不言自明的:

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,对吗?类运算符和类方法一样,对类型布局绝对没有影响。它们只是普通的独立函数,但具有特殊的作用域。类助手只允许用于类,而不允许用于记录,在这里无论如何都不合适。