3

今天找到一段代码,觉得有点臭。。。

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

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

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

4

3 回答 3

6

您可以分配给 Self,但它只是一个局部变量,您实际上不会更改该方法范围之外的任何内容。 因此,几乎可以肯定该代码不会像原始编码器显然认为它会做的那样。

于 2010-04-06T13:14:53.953 回答
2

考虑一个方法等价于接受 Object 作为其名为 Self 的第一个参数的自由例程

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

考虑到这一点,您会看到您可以在本地更改 Self 的内容而不会损坏原始 Object

但你是对的,它真的很,而且很容易出错。

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

于 2010-04-06T17:23:47.823 回答
1

是的,你可以使用 self 作为局部临时变量,即使在这里没用。但是在这种情况下,流对象必须和 self (TMyObject) 是同一个类,否则编译器会检测到错误,因为type are not compatible

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

于 2010-04-06T14:20:13.033 回答