分配自我的后果

时间:2010-04-06 12:46:27

标签: delphi variable-assignment self

今天找到了一段代码,我觉得有点臭...

TMyObject.LoadFromFile(const filename: String);
begin
  if fileExists(filename) then
    self := TSomeObjectStreamer.ReadObjectFromFile(filename);
end;

如果此代码有效,它至少会泄漏一些内存,但是它有效吗? 可以这种方式分配给自己吗?

如果流对象与原始自身的子类不同,该怎么办? 如果流对象属于与原始self没有共同祖先的不同类,该怎么办?

3 个答案:

答案 0 :(得分:6)

You can assign to Self, but it's only a local variable and you won't actually change anything outside the scope of that method.所以这段代码几乎肯定不会像原来的编码器那样认为它会做什么。

答案 1 :(得分:2)

考虑一个方法相当于一个自由例程,接受Object作为名为Self 的第一个参数:

TMyClass.MyRoutine({args})  <=>  MyRoutine(Self: TMyClass {; args})

考虑到这一点,您会看到您可以在不损坏原始对象的情况下在本地更改Self的内容

但你是对的,它确实是而且非常容易出错。

如果在评论中没有一个非常有说服力的案例,我就不会接受这样的代码......

答案 2 :(得分:1)

是的,你可以使用self作为本地临时变量,即使它在这里没用。 但在这种情况下,流对象必须与self(TMyObject)属于同一类,否则编译器将检测到错误,因为类型不兼容

在你的例子中,TSomeObjectStreamer.ReadObjectFromFile()应该返回一个TMyObject,或者你的compielr应该警告你(或抛出一个错误)