私は最近、私が書いたいくつかの非常に古いコードによって引き起こされた問題に出くわしました。これは明らかに、with
ステートメントで使用されているインターフェイス参照が -blockwith
を離れるとすぐに解放されると想定していました - 暗黙の -block のようなものですtry-finally
(C# のusing
-statementに似ています)。私が正しく理解していれば)。
どうやら (Delphi 2009 では) これは (もはや?) そうではありません。これがいつ起こったのか知っている人はいますか?それとも、私のコードはそもそも間違っていたのでしょうか?
明確にするために、簡単な例を次に示します。
type
IMyIntf = interface;
TSomeObject = class(TInterfacedObject, IMyIntf)
protected
constructor Create; override; // creates some sort of context
destructor Destroy; override; // cleans up the context created in Create
public
class function GetMyIntf: IMyIntf; //a factory method, calling the constructor
end;
procedure TestIt;
begin
DoSomething;
with (TSomeObject.GetMyIntf) do
begin
DoStuff;
DoMoreStuff;
end; // <- expected: TSomeObject gets destroyed because its ref.count is decreased to 0
DoSomethingElse;
end; // <- this is where TSomeObject.Destroy actually gets called
誰かが古い「with
悪である」という議論を始めたときはいつでも、これは常に私が心に留めていた 1 つの例であり、「はい、でも...」と言い続けました。私が間違っていたようです...誰か確認できますか?