2016-09-10 6 views
0

ボタン(Button1)がオンのフォーム(form1)があります。C#:参照の使用

例1では、Button1のテキストプロパティがform1の「CHANGED」に変更されますが、例2は変更されないのはなぜですか?なぜ違いがありますか?

例1:

namespace WindowsFormsApplication35 
{ 
    public partial class Form1 : Form 
    { 
     Button b1 = new Button(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      b1 = button1; 
      b1.Text = "CHANGED"; 
     } 
    } 
} 

例2:他のながら

namespace WindowsFormsApplication35 
{ 
    public partial class Form1 : Form 
    { 
     Button b1 = new Button(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      button1 = b1; 
      b1.Text = "CHANGED"; 
     } 
    } 
} 
+0

追加this.Controls.Add(b1);コードの副作用を実際に見ることができるようにコンストラクタに渡します。 –

+0

あなたはそれを詳しく教えてもらえますか? – Michael

答えて

0

画面上にあるボタンには、ヒープ上の「オブジェクト」と変数button1のヒープ上のメモリへの参照が2つあります。

InitializeComponent();の内部には、this.Controls.Add(button1)が呼び出されます。これは、this.Controlsのメモリ内の "オブジェクト"への別の参照を追加することになります。あなたはb1 = button1;やったとき

はあなたがb1.Text = "CHANGED";をしたときにbutton1で作成されたオブジェクトに変数b1ポイントに格納されている基準を作ったあなたどこオブジェクトに.Textを呼び出すこと変数b1button1、およびthis.Controls内部リファレンスすべてが指し示した。

button1 = b1;を作成したときには、button1という変数に格納されている参照を、b1で作成したオブジェクトに設定しました。ここでb1button1b1で作成されたオブジェクトを指し、this.Controlsの内部に保存された参照はまだbutton1で作成されたオブジェクトを指しており、そのオブジェクトを指す唯一の参照になっています。 b1.Text = "CHANGED";を実行したときに、b1button1という変数を指していて、オブジェクトthis.Controlsが指し示すオブジェクトを更新していないオブジェクトで.Textを呼び出した場合は、

パズルの最後の部分は、参考文献がthis.Controlsに格納されているオブジェクトで、スクリーンに表示されるものです。それが画面が更新されなかった理由です。例1では

1

ボタン1を設計者に定義されているので、それは自動でレンダリングされるので、それはあるが、フォームのコードを生成しましたボタンはインスタンス化されるだけで、どのフォームにも関連付けられません。

0

は、Buttonを作成し、それを指すようにb1を割り当てた後、あなたがしているbutton1と同じ実際のButtonを指すようにb1を割り当てます。 button1ボタンがフォーム上にあるので、変更が反映されていることがわかります。

例2では、​​Buttonというb1が指し示す逆順を作成していますが、button1と同じネブラスクボタンを指しています。そのボタンはフォームのControlsコレクションには追加されませんでしたので、フォーム上では見ることができません。

b1にはないbutton1に何が起こるかを確認するには、InitializeComponentメソッドのコードをご覧ください(定義へ移動を参照)。

0

あなたがこれを行うとき:

Button b1 = new Button(); 

をあなたが唯一のButtonのインスタンスを作成し、メモリに格納されています。例1では、あなたはこれをしなかった

Controls.Add(b1); 

は:

b1 = button1; 

これは、あなたがb1の値を変更することを意味しますが、フォームのコントロールに追加されるまでb1が画面に表示されません。 button1に格納されている値に変更します。このbutton1はWindowsフォームデザイナーによって生成されたものなので、InitializeComponentsメソッドの画面に追加されていると仮定します。

上記の行を実行する前に、b1には、画面に表示されない(参照先)ボタンが格納されています。行が実行されると、b1には画面に表示される(aへの参照)ボタンが保存されます。これは、テキストをb1に設定した後で、テキストの変更を確認できる理由です。あなたがb1button1の値を変更

button1 = b1; 

:例2では

は、あなたがこれをしませんでした。

次に、この行が実行されます。b1以来

b1.Text = "CHANGED"; 

はまだあなたがb1変更のテキストを見ることができない、画面に表示されないボタン(への参照)を格納します。