DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#とVB.NETのイベントについて

環境/言語:[Win XP , Visual Studio.Net]
分類:[.NET]

はじめまして
現在、C#とVB.NETを勉強し始めた所です。(素人です)
そこで、少し理解ができない部分があり、ご質問させて頂きます。
Visual Studio.Netの、プロジェクト作成で、C#、VB.Net共、Windowsアプリを選んで、フォームのみを作成した状態から、それぞれ、イベントを作成します。(今回は、MouseDownイベント)
C#では、”Windows フォーム デザイナで生成されたコード”に、イベントへの登録が記述され、VB.Netでは、追加されたイベント処理の後ろに、
Handle句で、イベントへの登録が記述されると思います。

C#では、this.MouseDown += ...
VBでは、...handles MyBase.MouseDown

私の認識では、C#の”this”は、自分のインスタンス、VB.Netの
”MyBase”は継承元のクラス(今回はForm?)と思うのですが、C#は自分のMouseDownイベント(継承されているイベント)から、独自実装のForm1_MouseDownを呼んでいて、VB.Netの場合は、継承元のクラス(Form)から独自実装のForm1_MouseDownを呼んでいるのでしょうか?(分りにくくてすみません)
要約すると
  C#の場合 Form1内の継承されたイベント->Form1_MouseDown呼び出し
  VBの場合 Form(親)のイベント->Form1_MouseDown呼び出し
と、なるのですが、この様な認識でいいのでしょうか?
そうすると言語によって、少し違い(処理内容よりも考え方?)がでてきて
しまうと思うのですが、それでいいのでしょうか?
それとも、私は、トンチンカンな事を言っているのでしょうか?

上記の件、上手く解説ができる方がいたら、是非お願いしたいのですが...

お手数ですが、よろしくお願いします。
■No10374に返信(初心者ですさんの記事)
> 要約すると
>   C#の場合 Form1内の継承されたイベント->Form1_MouseDown呼び出し
>   VBの場合 Form(親)のイベント->Form1_MouseDown呼び出し
> と、なるのですが、この様な認識でいいのでしょうか?

問題ないと思います。ただ、イベント自体がハンドラを呼び出すのではなく、
他の関数メンバのコードがイベントに追加されているハンドラを呼び出します。

> そうすると言語によって、少し違い(処理内容よりも考え方?)がでてきて
> しまうと思うのですが、それでいいのでしょうか?

非仮想メンバの実装は継承チェインの中に一つしかないので、基本クラスから
継承した自クラスのメンバと、基本クラスのメンバを区別する意味はありませ
ん。同じものです。どのような型を通してアクセスしても、結局は実装を持っ
ている唯一のクラスのメンバへアクセスしているともいえます。

要約の内容について少し書くと、this を通したメンバアクセスの方は、必ず
しも継承したイベントへのアクセスになるとは限りませんよね。Form1 クラス
で MouseDown と同名の別の新しいメンバを宣言していると、新しいメンバへ
のアクセスになります。そういう意味では両言語で処理内容が違うこともあり
そうです。
■No10425に返信(おおたさんの記事)
> ■No10374に返信(初心者ですさんの記事)

おおたさん、ご回答ありがとうございます。
結局、Controlから、継承しているイベントなので
”this””Me”でも、”Base””MyBase”でも、同じイベント
登録になると、考えていいのですね。
実際に、C#,VB共,form1のコンストラクタに、それぞれ”this””Base”
”Me””MyBase”として実行してみましたら、ちゃんとイベントが
発生しました。

現在勉強中で、色々と不明な点が出てくるとおもいますが、
今後ともよろしくお願いします。

ありがとうございました(^^)
解決済み!
#「初心者です」というお名前はマナー違反になりますので、ご注意ください。

MSDNの「Visual Basic 言語リファレンス:Handles」では、

Handles キーワードは、基本クラスからのイベントを処理するために派生クラスで使用することもできます。

とあり、「Visual Basic 言語の概念:イベント ハンドラの記述」では、「基本クラスから継承されたイベントの処理」として、

派生クラスは基本クラスから特性を継承したクラスであり、Handles MyBase ステートメントを使用して基本クラスが発生させたイベントを処理できます。

とあります。「イベント ハンドラの記述」にはAddHandlerの説明もありますが、「基本クラスから継承されたイベントの処理」としてはHandlesの例しかありませんので、Handlesの時だけMyBaseを使えということかもしれません。

また、ニュースグループでも同じような投稿があるようです。

http://www.dotnet247.com/247reference/msgs/6/34488.aspx

そもそもVB.NETのWithEventsはC#になく、this.MouseDown += ...とは全く異なることになります。

DOBON.NET | プログラミング道 | プログラミング掲示板