- PR -

C# WindowsForm:自動生成されるコードについて

1
投稿者投稿内容
GO-TEN
常連さん
会議室デビュー日: 2003/12/07
投稿数: 20
投稿日時: 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 ]
ant
常連さん
会議室デビュー日: 2004/03/24
投稿数: 44
投稿日時: 2004-09-04 01:02
そのフォーム内にコンポーネントが存在するか否かの違いだと思います。
InitializeComponent()内ではFormのControlsプロパティに
フォーム上のコントロールが追加されるコードが自動生成されると思います。
しかしここに一緒にコンポーネントを登録することはできません。
従って、フォーム上にTimerなどのコンポーネントを追加すると”パターン1”
のようになって、フォーム上にコンポーネントが無い時には”パターン2”のように
なります。
#フォームにTimerなどのコンポーネントを追加した瞬間に
#”パターン2”から”パターン1”への変化をみることが
#できると思いますよ。(^^
GO-TEN
常連さん
会議室デビュー日: 2003/12/07
投稿数: 20
投稿日時: 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)には戻されないのでよしとしてますが・・・。



ant
常連さん
会議室デビュー日: 2004/03/24
投稿数: 44
投稿日時: 2004-09-04 22:09
実はCLRではヒープ上のフィールドが既定値で正しく初期化されることを保証しています。
従って、warningが表示されますが、その意味するところはコード中で明示的に
nullを指定していないので、勝手に既定値nullを使用していますよ。ってことです。
1

スキルアップ/キャリアアップ(JOB@IT)