以下で何が起こっているのか知りたいです。
ListBox listboxNames = (ListBox)sender;
このことから私が理解しているのは、動的リストボックスが作成されるということです。
しかし、送信者は何をし、なぜそれが によってキャストされているの(ListBox)
でしょうか?
基本的に、それは変数を取っていますsender
(おそらくあなたの関数がおそらくイベントのハンドラーであるためです)?型にキャストし、ListBox
その値を という変数に入れますlistboxNames
。これが機能する理由は、基本的にはパラメーターsender
が であるListBox
ためですが、オーバーロードをロードせずに関数に送信できるようにするには、オブジェクトに変換する必要がありました (これは、ジェネリックが利用可能になる前でした)。ただし、キャストを使用すると、元の型に戻すことができます。
通常、sender
はイベントをスローするオブジェクトです。あなたの場合、おそらくListBoxであり、それがListBoxにキャストできる理由です。したがって、それは特別な魔法のオブジェクトではなく、一般的なオブジェクトとして「偽装」されたメソッドに渡される実際の ListBox です。
したがって、動的オブジェクトを作成しませんが、ListBox でなければならないことがわかっているので、安全にキャストして使用できます。ただし、GUI にあるのと同じ ListBox であるため、それに加えた変更はすべて GUI に反映されることに注意してください。
この場合、sender
ほとんどの場合、次のようなイベント ハンドラーのパラメーターです。
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
// sender only provides access to Object members
// radioButton provdes access to all members available to RadioButtons
RadioButton radioButton = (RadioButton)sender;
}
はい?イベント ハンドラーでsender
は、イベントを生成したオブジェクトへの参照です。あなたの例では、それは ListBox です。私の場合、それは RadioButton です。ただし、sender
はハンドラーでオブジェクトとして型指定されるため、その特定のインスタンスで使用可能なプロパティとメソッドの小さなサブセットにしかアクセスできません。ListBox や RadioButton などで使用できるすべての関数にアクセスする唯一の方法は、その型にキャストすることです。ここでは新しいオブジェクトは作成されないことに注意してください。あなたの例sender
ではListBoxです。同じオブジェクト インスタンスを指し、ListBox のすべてのメンバーへのアクセスを提供する新しい変数を作成しているだけです。