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のメモリが確保されていないということですね。 そう言われてみれば、今までデバッグでそういう現象を見たような記憶がある。不思議だなぁと思っていたような気もする。 ちゃーんと理解して、心にたたき込んで置かないと、デバッグ時にとまどうことになるぞ。よーく覚えておこう。 2006-12-25(Mon)■ ITmedia Biz.ID:書類の束に「背ラベル」を付けるお、kizuki君、ええ仕事してるやん。 君がいい仕事をするなんて、つまらんじゃないか(笑)。 ここのところウォッチしていなかったのだが、彼(or彼女)も成長したのだろうか。 1965|09|
|
//
自己紹介
自己紹介
広告
計るだけダイエット
つっこみリスト
TrackBacks
日記仲間
な/
す/
ひ/
最近の日記
|