- - PR -
C# WindowsForm:自動生成されるコードについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-09-03 14:07
C# で WindowsForm のアプリケーションを作成中です。
いくつか Form を作ったのですが、自動生成されるコードで疑問点があります。 どの Form でも、「System.ComponentModel.Container components」が自動的に 宣言されると思いますが、そのパターンが2種類あり、どういう意味なのか知りたいのです。 パターン1:フォームのクラスの宣言の後では宣言のみ、InitializeComponent の中で new される場合 public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; ・・・(中略)・・・ private System.ComponentModel.IContainer components; ・・・(中略) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); ・・・(以下略) パターン2:フォームのクラスの宣言の後で宣言と同時に null がセットされる場合 public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; ・・・(中略)・・・ /// <summary> /// 必要なデザイナ変数です。 /// </summary> private System.ComponentModel.Container components = null; ・・・(以下略) この違いは何なのでしょう?教えて下さい。 [ メッセージ編集済み 編集者: GO-TEN 編集日時 2004-09-03 14:12 ] |
|
投稿日時: 2004-09-04 01:02
そのフォーム内にコンポーネントが存在するか否かの違いだと思います。
InitializeComponent()内ではFormのControlsプロパティに フォーム上のコントロールが追加されるコードが自動生成されると思います。 しかしここに一緒にコンポーネントを登録することはできません。 従って、フォーム上にTimerなどのコンポーネントを追加すると”パターン1” のようになって、フォーム上にコンポーネントが無い時には”パターン2”のように なります。 #フォームにTimerなどのコンポーネントを追加した瞬間に #”パターン2”から”パターン1”への変化をみることが #できると思いますよ。(^^ |
|
投稿日時: 2004-09-04 16:01
たいへん初歩的な質問にお答えいただいて、ありがとうございます。
確かにTimerを追加してみると、 InitializeComponent()内に (1)this.components = new System.ComponentModel.Container(); が自動生成され、 (2)private System.ComponentModel.Container components = null; が (3)private System.ComponentModel.Container components; に自動的に変更されました。 が、追加したTimerを削除してみると、自動生成された上記(1)が自動的に削除されましたが、 (3)→(2)には戻りませんでした。 そこでコンパイルすると 「Form1.components' は割り当てられません。常に既定値 null を使用します。」 のwarning。 実はそもそもこれについて悩みだしたのが、この警告が出力されるからなのです。 自分で(3)→(2)に戻してしまっていますが、これってそういうもんだということでよいのでしょうか? とりあえず自動的に(3)には戻されないのでよしとしてますが・・・。 |
|
投稿日時: 2004-09-04 22:09
実はCLRではヒープ上のフィールドが既定値で正しく初期化されることを保証しています。
従って、warningが表示されますが、その意味するところはコード中で明示的に nullを指定していないので、勝手に既定値nullを使用していますよ。ってことです。 |
1