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

メソッドは、Selfという名前の最初のパラメーターとしてオブジェクトを受け入れるフリールーチンと同等であると考えてください。

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

そのことを念頭に置いて、元のオブジェクトに損傷を与えることなく、Selfのコンテンツをローカルで変更できることがわかります。

しかし、あなたは正しいです、それは本当に臭くて、エラーを起こしやすいです。

コメントに非常に強力な説得力のあるケースがなければ、そのようなコードは受け入れません...

于 2010-04-06T17:23:47.823 に答える
1

はい、ここでは役に立たなくても、ローカル一時変数として self を使用できます。ただし、この場合、ストリーミングされるオブジェクトは、自己 (TMyObject) と同じクラスである必要があります。そうしないと、型に互換性がないため、コンパイラがエラーを検出します。

あなたの例でTSomeObjectStreamer.ReadObjectFromFile()は、TMyObjectを返すか、コンパイラが警告する(またはエラーをスローする)必要があります

于 2010-04-06T14:20:13.033 に答える