今天找到了一段代码,我觉得有点臭...
TMyObject.LoadFromFile(const filename: String);
begin
if fileExists(filename) then
self := TSomeObjectStreamer.ReadObjectFromFile(filename);
end;
如果此代码有效,它至少会泄漏一些内存,但是它有效吗? 可以这种方式分配给自己吗?
如果流对象与原始自身的子类不同,该怎么办? 如果流对象属于与原始self没有共同祖先的不同类,该怎么办?
答案 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应该警告你(或抛出一个错误)