在delphi中初始化对象

时间:2013-07-21 09:29:45

标签: delphi delphi-xe4

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

有一些替代方案可以接近。

  1. ja-mesa已经指出了with构造,尽管最好避免这种构造。您可以看到我的blog(主要)无偏见地审查使用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');
    
  6. 当然,只需创建一个具有单个字符名称的临时变量,即可完成同样的任务。

    var
      o: TMyObject;
    
    begin
      o := TMyObject.Create;
      o.FirstName := 'Craig';
      o.LastName := 'Playstead';
      Result := o;
    end;
    

答案 1 :(得分: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;

答案 2 :(得分:1)

您可以覆盖并重新引入constructor Create。我建议在StackOverflow上阅读this fine answer

答案 3 :(得分:1)

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