这段GUI应用程序的代码可以编译并运行:
procedure TForm1.Button1Click(Sender: TObject);
begin
Self := TForm1.Create(Owner);
end;
(在Delphi 6和2009中测试过)
- 为什么Self是可写的而不是只读的?
- 在哪些情况下这可能有用?
编辑:
- 在Delphi Prism中是否也可以实现?(我认为可以,参见这里)
更新: 使用Self赋值的Delphi应用程序/库:
这段GUI应用程序的代码可以编译并运行:
procedure TForm1.Button1Click(Sender: TObject);
begin
Self := TForm1.Create(Owner);
end;
(在Delphi 6和2009中测试过)
编辑:
更新: 使用Self赋值的Delphi应用程序/库:
这并不像你认为的那么糟糕。我刚在 Delphi 2009 中进行了测试,看起来虽然 Self 参数没有使用 const 语义,但也没有使用 var 语义,因此你可以在方法内部随意更改它,而不会失去调用者对对象的引用。这将是一件非常糟糕的事情。
至于原因,可能是疏忽大意,或者像 Marco 所建议的那样:允许你将 Self 传递给一个var参数。
将值分配给自身是非常不合逻辑且无用的,这种“特性”可能是一个疏忽。而且,与可分配常量一样,纠正此类问题并不总是容易的。
这里的简单建议是:不要这样做。
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Integer(@Self)));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
newform: TForm;
p: ^Integer;
begin
Self.Caption := 'TheOriginal';
newform := TForm.Create(nil);
try
newform.Caption := 'TheNewOne';
// The following two lines is, technically, the same as
// Self := newform;
p := Pointer(@Self);
p^ := Integer(newform);
ShowMessage(Self.Caption); // This will show 'TheNewOne' instead of 'TheOriginal'
finally
Self.Free; // Relax, this will free TheNewOne rather than TheOriginal
end;
end;