K2さんの雑記
2002-12-25(Wed) [長年日記]■ 未熟Delphi-ML にて「えっ」という議論が... インスタンスを作成しなくても、クラスの通常メソッドは呼べてしまう。 試しに、
type
TFoo = class
public
procedure Show;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
procedure TFoo.Show;
begin
ShowMessage('OK');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
foo: TFoo;
begin
foo := nil;
foo.Show; // <---------------------------------------- (a)
end;
(a) で、アクセス違反は起きない。
(a) のコードでは、コンパイラは Show の呼び出しを行うだけで、
foo の参照についてはテストしない!
うー、知らなかった。当然 foo が nil の時は、Show 呼び出しでアクセス違反になると思っていたら、そうじゃないとは。確かに、呼び出しのコードを作成するだけと考えたら、それですべてつじつまが合うのだ。 ちなみに、
type
TFoo = class
private
FTest: Integer; // <--------------------------- 追加
public
procedure Show;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
procedure TFoo.Show;
begin
ShowMessage(IntToStr(FTest)); <------------------- (b)
end;
procedure TForm1.Button1Click(Sender: TObject);
var
foo: TFoo;
begin
foo := nil;
foo.Show;
end;
とすれば、(b)でアクセス違反が起きます。fooのインスタンスはまだ作成されていないので、FTestのメモリが確保されていないということですね。 そう言われてみれば、今までデバッグでそういう現象を見たような記憶がある。不思議だなぁと思っていたような気もする。 ちゃーんと理解して、心にたたき込んで置かないと、デバッグ時にとまどうことになるぞ。よーく覚えておこう。 [ツッコミを入れる]
1965|09|
|
//
自己紹介
自己紹介
広告
計るだけダイエット
つっこみリスト
TrackBacks
日記仲間
な/
す/
ひ/
最近の日記
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||