我写了这样一个简单的类:
TMyClass = class
procedure MyProcedure(Sender : TObject);
end;
我正在执行“MyProcedure”,在对象被释放后我永远不会引用“Self”:
var
MyObj : TMyClass;
ProcOfObj : TNotifyEvent;
begin
MyObj := TMyClass.Create;
try
ProcOfObj := MyObj.MyProcedure;
finally
MyObj.Free;
end;
ProcOfObj(Self);
end;
它有效,但我想知道这是否是一种安全的做法,或者是否会引起某些问题。
答案 0 :(得分:10)
如果MyProcedure
及其调用的任何方法实际上没有引用Self
实例,那么您将不会遇到运行时错误。但是,这是一个冒险的游戏。只需要对代码进行一些未来的更改,而不会发现此问题,并输入未定义的行为区域。您可能会遇到运行时错误,或者您可能没有。并且编译器不会保存你。
你不想冒这个风险。因此,由于您的方法不引用实例,因此请不要将其作为实例方法。
type
TMyClass = class
class procedure MyProcedure(Sender : TObject);
end;
而是使它成为一个类方法。这样就可以避免风险,如果将来某个时候你尝试引用该实例,编译器会保存你。
答案 1 :(得分:3)
这绝对是不安全做法。 一旦过程尝试访问其自己对象的成员变量,您将收到访问冲突。 不要在代码中放置这样的陷阱。您或您的团队成员迟早会陷入其中。
答案 2 :(得分:2)
它不安全,它破坏了代码封装。
想象一下,如果最终您TMyClass.MyProcedure
的实施发生变化并开始引用self
?你会得到一个分段错误。
另外,你反对OOP,因为你必须知道你要调用它的方法的实现细节。
如果要强制您的方法不引用Self
指针,请将该方法声明为静态成员。