• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:なぜForm型にキャストするのでしょう?)

なぜForm型にキャストするのでしょう?

このQ&Aのポイント
  • C#の勉強をしている中で、イベントを発生させるためにデリゲートに自分で作ったメソッドを引数として送るということを学びました。
  • しかし、特定のメソッドの引数として渡されるオブジェクトの型はどのように決まるのでしょうか?
  • 特に、object型の引数が渡された場合、なぜそのオブジェクトはForm型として扱うことができるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> object objsender のobjectという型は > すべてのクラスのルートであるという System.Object のObjectの部分でしょうか? > 先頭が小文字なので別物でしょうか? class Program { public static void Main() { System.Console.WriteLine(typeof(string)); System.Console.WriteLine(typeof(object)); System.Console.WriteLine(typeof(int)); } } それぞれ System.String, System.Object, System.Int32 の alias(別名) です。

tranceporter
質問者

補足

もう少し質問させてください。 System.Console.WriteLine(typeof(object)); が System.Object; のエイリアス、ということは、 object objSender のobjectという型は?? http://msdn.microsoft.com/ja-jp/library/9kkx3h3c(v=vs.90).aspx ↑のURLにあるobjectでという型で良いですか?

その他の回答 (3)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>つまりobjsender はどんなものにもキャスト可能、と思って良いですか? いいえ。 キャスト可能なのは、そのインスタンスのクラスやその親クラス、実装インターフェイスなどだけです。 なので厳密には if (objsender is Form) { Form form = (Form)objsender; } のようにobjsenderがFormかどうか確認した上でキャストします。 もしくは // objsenderがFormにキャスト不可能なときにはformにはnullが設定される Form form = objsender as Form;

tranceporter
質問者

お礼

貴重な回答ありがとうございます。ベストアンサーにしたいと思いましたが それと同様と思ってください。ありがとうございます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

一般的なことをいえば、イベントハンドラに渡されたsender(ここではobjSender)がForm型であるとはかぎりません。 なぜなら、イベントハンドラをイベントとして処理するのではなく、直接呼び出すこともできてしまうからです。 ただ、今回のケースに限っていえば、MyPaintHandlerメソッドはprivateで他のクラスから呼ばれる可能性はなく、Form.Paintに登録しているので、Form型のオブジェクトがobjectに変換されて渡されることが期待できるということです。 厳密なことをいえば、"Paint Hello"というフォームのタイトルを頼りにするなどしてformのインスタンスを見つけ出し、Paintイベントを漁ってMyPaintHandlerを取り出した上で直接呼び出すといったこともできるでしょうから、やや無防備なのは確かですが... キャストが必要なのは、FormクラスのFontプロパティを使うためです。 Formではなくobject型のままではFormクラスのプロパティにアクセスすることはできません。

tranceporter
質問者

お礼

回答ありがとうございます。 検証プログラムをいろいろやってみて大変勉強になりました。 もう少しC#の挙動を理解する必要があるようです。 またよろしくお願いいたします。

tranceporter
質問者

補足

ありがとうございます。Fontプロパティを使うためのキャスト、理解しました。 もう少し質問させてください。その右側にある object objsender のobjectという型は すべてのクラスのルートであるという System.Object のObjectの部分でしょうか? 先頭が小文字なので別物でしょうか? つまりobjsender はどんなものにもキャスト可能、と思って良いですか?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

>object型というのを調べるとSystem名前空間にObjectというクラスがあるのですが、これはすべてのクラスのルートであり、、、とMSDNに書かれていて、なぜForm型と言えるのかわかりません。 鍵は >form.Paint += new PaintEventHandler(MyPaintHandler); です。 formがPaintイベントを呼び出すときform自身をsenderとして渡します。 MyPaintHandlerはformのPaintイベントからしか呼び出されるように設定されていませんからMyPaintHandlerの第1引数のobjSenderのインスタンスはformなのでForm型ということになります。 >そもそもこのキャストはなぜ必要なのでしょう。お願いします。 ObjectのままだとFormのメソッドやプロパティが使えないからです。

tranceporter
質問者

お礼

ObjectクラスのままだとFormのメソッドやプロパティが使えない、ということは理解できました。 質問なのですが、object objSender の部分のobjectという型宣言は、 System.ObjectクラスのObjectと同じ者でよいですか? oの文字が小文字と大文字で違うものをさしてはないでえしょうか?

関連するQ&A