2017-06-11 5 views
-1

我々は2つのフォーム上のボタン、button1button2を有し、これらのイベントは、それらに関連付けられているフォーム上の2つのボタンが等価であると実際にはどうなりますか?

private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("button1"); 
    } 
    private void button2_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("button2"); 
    } 

我々は別のボタンを使用してbutton1 = button2を実行した場合、その後、それらの両方がbutton1.Equals(button2)と同じ構成要素を参照する必要があるとし真の、そして今の例button1.Textためbutton2.Text

と同じですが、私はbutton1をクリックした場合、それはまだ「ボタン1」を示し、と私はbutton1.Click += button2_Clickを実行した場合、ボタン1はまだ「Button1を」示すが、button2ショーs "button2" 2回

button2にはイベントが2回実行されるように2つの参照がありますか?実際にフォームに表示されたbutton1はどうですか?私はその参照を失ったのですか?私は何が起こったのか、そして、等価性が実際にボタンやフォームワークコンポーネントのようなイベントを持つ一般的なコンポーネントで何をするのかを理解していません。

+0

それを試してみて、参照してください。 – MickyD

+2

button1オブジェクトに対して* reference *をなくしました。それはあなたのUI上に表示されたままにして生き続けます。またClickイベントは登録されていないので、参照を失う前にbutton1_Clickを呼び出していることが分かります。このようなコードを書くことはあまり役に立ちません。 –

+0

@HansPassantありがとう、それは今明らかになった。 –

答えて

1

イベントハンドラは、ボタンオブジェクトにアタッチされています。 button1button2は、そのオブジェクトを指すリファレンス変数です(obj1obj2と呼ぶことができます)。イベントハンドラをアタッチし、変数button2がオブジェクトobj1を指すようにすると、イベントハンドラは依然としてobj2にアタッチされます。あなたはbutton2button1を割り当てた場合

1

我々は別のボタンを使用してボタン1 =ボタン2を実行した場合、その後、それらの両方がbutton1.Equalsと同じ構成要素を参照する必要があります(ボタン2)は

本当である、それはすべてのあなたが割り当てをどこで行うかによって異なります。 、そして、

var clickedButton = (Button)sender; 
clickedButton = button2; 

senderbutton1あり、そしてあなたがそれにbutton2を割り当てるにもかかわらず、あなただけのコピーに割り当てる:あなたはbutton1のクリックハンドラに割り当てを行う場合button1は、次のようにクリックされたときに、 button1の参照。参照は値渡しされます。しかし

、あなたがこのなかった場合:

button1 = button2; 

を、あなたはあなたがしてbutton1button2と同じ参照になる、ということでしたメソッド内で何button1を持っていません。私はこのすべてを表示するために一緒にFiddleを入れ

this.button1 = this.button2; 

:それは以下と同じになります。私はここにコードをコピーして利用できるようにします。コードに説明を提供するコメントがあります。


using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Program 
{ 
    private static Form f1 = new Form(); 
    public static void Main() 
    { 
     f1.button1.Text = "Button 1"; 
     f1.button2.Text = "Button 2"; 
     // The Click method will change the buttons but the change 
     // will only be within the Click method. Not outside. 
     f1.button1.Click(f1.button1, EventArgs.Empty); 

     // This will still write "Button 1" 
     Console.WriteLine(f1.button1.Text); 

     // Now if we do the assignment like this 
     f1.button1 = f1.button2; 
     f1.button1.Click(f1.button1, EventArgs.Empty); 

     // this will write "Button 2" 
     Console.WriteLine(f1.button1.Text); 

     // Now pass as reference 
     // We will pass button3 whose text is "Button 3" but it will be assigned 
     // to button4, so the output will be "Button 4" 
     f1.button3.Text = "Button 3"; 
     f1.button4.Text = "Button 4"; 
     button1_Click(ref f1.button3, EventArgs.Empty); 
     Console.WriteLine(f1.button3.Text); 
    } 

    public static void button1_Click(ref Button sender, EventArgs e) 
    { 
     sender = f1.button4; 
    } 
} 

public class Form 
{ 
    public Button button1 = new Button(); 
    public Button button2 = new Button(); 
    public Button button3 = new Button(); 
    public Button button4 = new Button(); 
    public Form() 
    { 
     button1.Click += button1_Click; 
     button2.Click += button1_Click; 
    } 

    public void button1_Click(object sender, EventArgs e) 
    { 
     var clickedButton = (Button)sender; 
     clickedButton = this.button2; 
    } 
} 

public class Button 
{ 
    public EventHandler Click; 
    public string Text 
    { 
     get; 
     set; 
    } 
} 
関連する問題