次のページへWindowsフォームデザイナーで生成されたコード(Form1.Designer.csファイル)次のコードはForm1.Designer.csファイルの内容である。必要なデザイナー変数です。使用中のリソースをすべてクリーンアップします。サポートに必要なメソッドです。エディターで変更しないでください。InitializeComponent(){......中略......}#endregion......中略......}}Windowsアプリのフォームデザイナー用のコード(Form1.Designer.csファイル)Form1.Designer.csファイルとForm1.csファイルの2つのファイルに部分クラスとして定義されたForm1クラスには、1つのフィールド変数(components変数)と3つのメソッドがある(Form1コンストラクタメソッド、Disposeメソッド、InitializeComponentメソッド)。2017のIDEでコードを折りたたんで表示/非表示を切り替えることが可能な場所である。TIPS:VS.NETでソース・コードを見やすくするには?」を参照していただきたい。2017のフォームデザイナーにより自動生成されるコードは通常、プログラマーが参照する必要がないことから、非表示とするために使われている。Form1.Designer.csファイルに部分クラスとして分離されたForm1クラスには、次のような変数(「フィールド変数」とも呼ばれる)とメソッドがある。InitializeComponent()このように、先ほどのForm1.csファイルのForm1クラスのコンストラクタで呼び出されていたInitializeComponentメソッドは、Form1.Designer.csファイルに部分クラスとして分離されているForm1クラス内にあることが分かった。System.Windows.Forms.Form」)は省略可能だ*3。部分クラスとして分離されたクラスのどれか1つにアクセス修飾子と基底クラスの宣言が含まれていれば、その他のクラスではそれらを省略できる。本稿で説明するWindowsアプリのひな型コードの例では、Form1.csファイルのForm1クラスの方にアクセス修飾子と基底クラスが宣言されているので、Form1.Designer.csファイルのForm1クラスでは省略可能となる。逆に他のファイルで既に宣言されているアクセス修飾子や基底クラスと異なる記述をするとエラーとなる。それでは、これらのフィールド変数やメソッドについて、個別に解説していこう。components変数1の「components」変数はクラス内で使用されるフィールド変数で、複数のコンポーネントをひとまとめに管理するためのものだ(「複数のコンポーネントを格納しておく」といった意味合いから「コンテナ」と呼ばれる)。-」を参照してほしい。null;components変数の宣言ここではcomponents変数に「null」が代入されている(=コンテナが存在していない)が、3で説明するInitializeComponentメソッドの中に次のようなコードが自動的に生成されるため、実際にはContainerオブジェクト(System.ComponentModel名前空間)がcomponents変数に格納されることになる。System.ComponentModel.Container();WindowsフォームデザイナーによりForm1.Designer.csファイルに自動生成されるコードの例(components変数へのContainerオブジェクトの代入)そして、Windowsフォームデザイナー上に[ツールボックス]からTimerなどのコンポーネントを追加すると*4)、追加したコンポーネントがそのContainerオブジェクトに格納される(複数のコンポーネントを追加すると、それらがコンテナに順次追加されていく)。Disposeメソッドで終了処理」で使用される。ここでいう「コンポーネント」とは、Buttonコントロールなどの目に見えるUI要素を持ったプログラム部品ではなく、Timerコンポーネントなどの目には見えないがWindowsフォームに配置して何らかの処理に使用するプログラム部品のことだ。Windowsフォームアプリでは、components変数を使ってコンポーネントの管理を行っている。初めのうちはあまり気にしなくてもよいだろう。disposing)」メソッドには「終了処理」を記述する。終了処理とは「不要なデータを破棄する処理や、クラス終了時に実行しなければならない処理」のことだ(上の例のようにTimerコンポーネントを追加していた場合には、そのコンポーネントの破棄などが行われる)。ここでは「初期化処理はコンストラクタ、終了処理はDisposeメソッドで行う」と対にして覚えておけばよい(終了処理については下のコラムを参照)。ファイナライザー(=デストラクタ)についてコンストラクタの正反対の処理を行うためのメソッドは、ファイナライザーである(「デストラクタ」とも呼ばれる)。.NETでは、ガベージコレクション機能があるため、ファイナライザーを呼び出すタイミングが不確定になっている(ガベージコレクションとは「メモリを自動的に管理する」ための.NETの機能で、これによって.NETではメモリリークと呼ばれるが発生しにくくなっている)。そこで、終了処理を明示的に行えるものとしてDisposeメソッドが用意されている。このDisposeメソッドを明示的に呼び出せば、確実にその場で終了処理が実行できる。暗黙的に終了処理を行うためには、Disposeメソッドではなくファイナライザーを実装することになる(これは、ガベージコレクション機能に自動的に後処理を行わせるということだ)。Finalize()」というメソッド名になる)。TIPS:確実な終了処理を行うには?」を参照するとよい。Disposeメソッドでは、protected修飾子の次に、さらにoverride修飾子がある。C#のoverride修飾子(VBではOverrides修飾子)は、継承されたクラスでのみ使用できる修飾子で、基底クラスにあるメソッドを新しい派生クラスのメソッドで置き換えることを示すためのものだ。このひな型コードでは、「基底クラスであるFormクラス(System.Windows.Forms名前空間)のDisposeメソッドを、派生クラスであるForm1クラス(WindowsFormsApp1名前空間)のDisposeメソッドで置き換える」ということを示している。このようなメソッドの置き換えを、オブジェクト指向言語では、メソッドの「オーバーライド」と呼ぶ。Disposeメソッドの実装内容は次のようになっている。書かれたコードを実行する」という意味である。「条件」には条件が成り立っていることを意味する「真」(true)か、成り立っていないことを意味する「偽」(false)で表される値を指定する(このような値のことを「bool値」と呼ぶ)。「変数の値が0かどうか」などが条件となる。「&&」演算子は論理積を表し、日本語で表現するなら「かつ」という語句に当てはまる。B」は「AかつB」という意味になる。スコープのコードを実行する」という意味になる。「disposing」はDisposeメソッドのパラメーターに指定されたbool型の変数(=bool値)であり、Form1クラスのDisposeメソッドについては通常、この値はtrueとなる*5。null)」というコードだが、C#の「!=」比較演算子は「同じではない」を表すので(ちなみに「==」比較演算子が「同じである」を表す)、このコードの意味は「components変数がnullと同じではない」となる。前述の通り、components変数には3のInitializeComponentメソッドでContainerオブジェクトが代入される。「components変数がnullと同じではない」は「真(=成り立つ、true)」という結果になる。スコープのコードが実行されることになる。このDisposeメソッドのdisposingパラメーターは、Disposeメソッドがユーザーのコードによって直接もしくは間接的に呼び出されたときにtrueとなり、共通言語ランタイム(=.NET実行エンジン)のファイナライザーによって呼び出されたときにはfalseとなる。スコープのコードが実行されることになる。そのスコープ内には「components.Dispose();」というコードがあるが、これはcomponents変数の終了処理を行うために、さらにcomponents変数のDisposeメソッドを呼び出すコードである*6。Windowsフォームデザイナーでコンポーネントを追加すると、コンテナであるcomponents変数にそのコンポーネントが登録される。そこで登録された全てのコンポーネントのDisposeメソッドが、このcomponents変数のDisposeメソッドの中から呼び出されるため、全てのコンポーネントのリソース破棄などの後処理を漏れなく実行できるという仕組みになっている。最後にある「base.Dispose(disposing);」は、基底クラスのDisposeメソッドを呼び出すコードである。前回の継承の説明でも述べたようにForm1クラスには、継承元となる基底クラスが存在する。その基底クラスのオブジェクトは「base」というキーワードにより参照できる(VBでは、「MyBase」というキーワード)。このキーワードは通常のオブジェクトのように「オブジェクト名.メソッド名」の形式で利用できる。よって、この「base.Dispose(disposing);」というコードは、「基底クラスにあるDisposeメソッドを呼び出す」という処理コードになる。InitializeComponent()」メソッドは、Form1.csファイルに記述されたForm1クラスのコンストラクタから呼び出されるクラス内部専用のメソッドである(クラス内部専用のメソッドであることは「private修飾子」で分かる)。このメソッドの内容を見ると、次のようになっている(一部省略。下記のようにcomponents変数が設定されるのは、Windowsフォームにコンポーネントが追加されているなど、特定の場合のみ)。components変数」で説明した。System.Windows.Forms.AutoScaleMode.Font;」は、Windowsフォームやその中のコントロールのサイズを自動調整(=自動スケーリング)する際の基準を示すモードを指定する。代表的なモードには以下のものがある。この表を見ると、ここではフォントサイズを基準にした自動スケーリングを行うモードを指定していることが分かる。"Form1";」は、Windowsフォームのタイトルテキストを指定するためのコードで、ここでは「Form1」を指定している。この値を変更するには、前々回に説明したWindowsフォームデザイナー画面で、[プロパティ]ウィンドウの[Text]プロパティを書き換えればよい。以上のようにInitializeComponentメソッド内では、Form1オブジェクト(=Windowsフォーム画面)の初期値を設定している。フォームにボタンなどを配置することで、上記のコードがどのように変化するかを読み解いていくと理解が進むかもしれないので、興味のある方はぜひ試してみてほしい。最後にここまでの説明を踏まえてひな型コード全体の実行の流れを見てみよう。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。