using System;
using System.Drawing;
using System.Windows.Forms;
class PaintHello
{
public static void Main()
{
Form form = new Form();
form.Text = "Paint Hello";
form.BackColor = Color.White;
form.Paint += new PaintEventHandler(MyPaintHandler);
Application.Run(form);
}
static void MyPaintHandler(object objSender,PaintEventArgs pea)
{
Form form = (Form)objSender;//←この部分が分かりません。
Graphics grfx = pea.Graphics;
grfx.DrawString("Hello,world!", form.Font, Brushes.Black, 0, 0);
}
}
C#の勉強をしているのですが、イベントを発生させるためにデリゲートに自分で作ったメソッドを
引数として送るというのは理解できるのですが、
このMyPaintHandlerのobject objSender という部分が、書籍の説明だと「objSenderはForm型のオブジェクトなのでキャストはうまくいく」
と書かれています。
object型というのを調べるとSystem名前空間にObjectというクラスがあるのですが、これはすべてのクラスのルートであり、、、とMSDNに書かれていて、なぜ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(別名) です。
この回答への補足
もう少し質問させてください。
System.Console.WriteLine(typeof(object));
が System.Object; のエイリアス、ということは、
object objSender のobjectという型は??
http://msdn.microsoft.com/ja-jp/library/9kkx3h3c …
↑のURLにあるobjectでという型で良いですか?
No.4
- 回答日時:
>つまりobjsender はどんなものにもキャスト可能、と思って良いですか?
いいえ。
キャスト可能なのは、そのインスタンスのクラスやその親クラス、実装インターフェイスなどだけです。
なので厳密には
if (objsender is Form) {
Form form = (Form)objsender;
}
のようにobjsenderがFormかどうか確認した上でキャストします。
もしくは
// objsenderがFormにキャスト不可能なときにはformにはnullが設定される
Form form = objsender as Form;
No.2
- 回答日時:
一般的なことをいえば、イベントハンドラに渡されたsender(ここではobjSender)がForm型であるとはかぎりません。
なぜなら、イベントハンドラをイベントとして処理するのではなく、直接呼び出すこともできてしまうからです。
ただ、今回のケースに限っていえば、MyPaintHandlerメソッドはprivateで他のクラスから呼ばれる可能性はなく、Form.Paintに登録しているので、Form型のオブジェクトがobjectに変換されて渡されることが期待できるということです。
厳密なことをいえば、"Paint Hello"というフォームのタイトルを頼りにするなどしてformのインスタンスを見つけ出し、Paintイベントを漁ってMyPaintHandlerを取り出した上で直接呼び出すといったこともできるでしょうから、やや無防備なのは確かですが...
キャストが必要なのは、FormクラスのFontプロパティを使うためです。
Formではなくobject型のままではFormクラスのプロパティにアクセスすることはできません。
この回答への補足
ありがとうございます。Fontプロパティを使うためのキャスト、理解しました。
もう少し質問させてください。その右側にある object objsender のobjectという型は
すべてのクラスのルートであるという System.Object のObjectの部分でしょうか?
先頭が小文字なので別物でしょうか?
つまりobjsender はどんなものにもキャスト可能、と思って良いですか?
回答ありがとうございます。
検証プログラムをいろいろやってみて大変勉強になりました。
もう少しC#の挙動を理解する必要があるようです。
またよろしくお願いいたします。
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のメソッドやプロパティが使えないからです。
ObjectクラスのままだとFormのメソッドやプロパティが使えない、ということは理解できました。
質問なのですが、object objSender の部分のobjectという型宣言は、
System.ObjectクラスのObjectと同じ者でよいですか?
oの文字が小文字と大文字で違うものをさしてはないでえしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaのインスタンス化の構文の...
-
委譲って何ですか?
-
「継承されたメソッドの可視性...
-
なぜForm型にキャストするので...
-
サーバー上のフォルダ情報の取得
-
C# 「データが失なわれる可能性...
-
(vba)他のアプリケーションの右...
-
「IOException は対応する try ...
-
JAVAの初歩でとても悩んでます・・
-
親クラスのメソッドを別のパッ...
-
interface,extend,implementの...
-
ASP.NETでの共通コードの書き方...
-
VBAでの[]
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
-
private static という変数の修飾
-
Java初級 引数に適用できません
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
C# 「データが失なわれる可能性...
-
「ラッパークラス」の存在意義...
-
c++でのヘッダーファイルの循環...
-
(vba)他のアプリケーションの右...
-
「継承されたメソッドの可視性...
-
「IOException は対応する try ...
-
ゲッターを使わないで変数にア...
-
JavaでのAPIの覚え方ってみさな...
-
VB DLLプロジェクトについて
-
Javaで下線
-
【C#】クラスのコンストラクタ...
-
Javaのインスタンス化の構文の...
-
委譲って何ですか?
-
ASP.NETでの共通コードの書き方...
-
オーバーライドとラッパーの違い
-
抽象クラスをJUNITでテストする...
-
JTextFieldの入力制限
-
Commons-Discovery.jarとは?
-
setTextについて
おすすめ情報