2

如您所知,在 c# 中初始化对象非常方便快捷

    StudentName student2 = new StudentName
    {
        FirstName = "Craig",
        LastName = "Playstead",
    };

List<MyObject>.Add(new MyObject{a=1,b=2})

是否可以像这样在 Delphi 中初始化对象?

4

4 回答 4

5

正如其他人指出的那样,没有像 C# 中那样的对象初始化器语法。

有一些接近的替代方案。

  1. ja-mesa已经指出了这个with结构,尽管最好避免这个结构。您可以查看我的博客with,对使用其他语言和其他语言的类似结构和一些替代方案的利弊进行(大部分)公正的评论。
  2. 匿名方法可以用于此,尽管它们有点冗长且有点难看:

    TMyObject.Create(procedure(var  FirstName, LastName: string)
                     begin
                       FirstName := 'Craig';
                       LastName := 'Playstead';
                     end);
    
  3. 一个流畅的界面可以非常接近于这个:

    TMyObject.Create
             .FirstName('Craig')
             .LastName('Playstead');
    

    缺点是编写流畅的界面非常耗时,并且只有在您计划大量使用此类或正在编写公共 api 时才会得到回报。

  4. 不断的记录也非常接近。

    const
      MyRecord: TMyRecord =
      (
        FirstName : 'Craig';
        LastName : 'Playstead';
      );
    

    明显的缺点是它是一个常数

  5. 另一种解决方案是重载构造函数:

    TMyObject.Create('Craig', 'Playstead');
    

当然,您可以通过简单地创建一个具有单个字符名称的临时变量来完成同样的事情。

var
  o: TMyObject;

begin
  o := TMyObject.Create;
  o.FirstName := 'Craig';
  o.LastName := 'Playstead';
  Result := o;
end;
于 2013-07-21T18:56:51.147 回答
4

不,在 Delphi 中没有直接的等价物,有这样的东西:

Student2:=StudentName.Create();
with Student2 do
begin
  FirstName:= 'Craig';
  LastName:= 'Playstead';
end;

MyObject:=TMyObject.Create();
With MyObject do
begin
    a:=1;
    b:=2;
end;
List.Add(MyObject);

// Although, there is something in Delphi that I haven't found in C++, Java or C#
With TMyObject.Create do
try
    // You can access TMyObject properties and method in here
finally
    Free;
end;

// For example:
With TMyModalForm.Create(Self) do
try
    if ShowModal() = mrOK then
    begin
        // etc
    end;
finally
    Free;
end;
于 2013-07-21T17:04:29.520 回答
1

您可以覆盖并重新引入constructor Create. 我建议在 StackOverflow 上阅读这个很好的答案。

于 2013-07-21T10:36:04.827 回答
1

Delphi 中没有等效的语法。您必须要么reintroduce构造函数向其添加新参数,要么先构造对象,然后根据需要单独分配其成员/属性。

于 2013-07-21T16:09:33.117 回答