如你所知,在c#中初始化对象非常方便快捷
StudentName student2 = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
};
和
List<MyObject>.Add(new MyObject{a=1,b=2})
是否可以像这样在Delphi中初始化对象?
答案 0 :(得分:5)
正如其他人所指出的,没有像C#中那样的对象初始化器语法。
有一些替代方案可以接近。
with
构造,尽管最好避免这种构造。您可以看到我的blog(主要)无偏见地审查使用with
的优缺点以及其他语言和其他替代方案中的类似结构。匿名方法可以用于此,虽然它们有点冗长和丑陋:
TMyObject.Create(procedure(var FirstName, LastName: string)
begin
FirstName := 'Craig';
LastName := 'Playstead';
end);
一个流畅的界面可以接近这个:
TMyObject.Create
.FirstName('Craig')
.LastName('Playstead');
缺点是编写流畅的界面非常耗时,只有在计划大量使用这个课程或正在编写公共API时才能获得回报。
常数记录也非常接近。
const
MyRecord: TMyRecord =
(
FirstName : 'Craig';
LastName : 'Playstead';
);
明显的缺点是它是一个常数
另一种解决方案是重载构造函数:
TMyObject.Create('Craig', 'Playstead');
当然,只需创建一个具有单个字符名称的临时变量,即可完成同样的任务。
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
构造函数向其添加新参数,或者先构造对象,然后根据需要单独分配其成员/属性。