【C#プログラミングレッスン】 No.232-FxCopに学ぶ(14): CA2214
発行日:11/24
■━ [C#プログラミングレッスン] ━━━━━━━━━━━━━ No.232 ━□
「FxCopに学ぶ編」 -- CA2214:
Do not call overridable methods in constructors
by Gushwell
□━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━■
■□─────────────────────────────────
■□ CA2214: Do not call overridable methods in constructors
以下のようなコードを書くと FxCopは、CA2214の警告を表示します。
このコードは何が悪いのでしょうか?
public class BaseClass {
public BaseClass() {
Console.WriteLine("Base:ctor");
Hoge();
}
public virtual void Hoge() {
Console.WriteLine("Base:Hoge");
}
}
それは、BaseClassの中で、virtualなメソッドを呼びだしている点です。
別にこれだけでは問題は表面化しませんが、ここから新たなクラスを派生させ
た時に問題が発生します。この BaseClassを継承した、DelivedClassを定義し
てみます。
public class DelivedClass : BaseClass {
public DelivedClass() : base() {
Console.WriteLine("Delived:ctor");
}
public override void Hoge() {
Console.WriteLine("Delived:Hoge");
}
}
このDelivedClassでは、Hogeメソッドをoverrideしています。
そして、
DelivedClass dc = new DelivedClass();
を実行します。
結果はどうなるでしょうか。
Base:ctor
Delived:Hoge
Delived:ctor
となります。よく見てください。
このDelivedClassの作者の意図した動きでしょうか?
問題は、Delived:Hogeと表示されている点です。
DelivedClassオブジェクト生成時に、Hogeメソッドが呼ばれるのは、
DelivedClassの作者にとって、予期していない動作の可能性が大です。
つまり何らかの不都合が起こる危険があります。
そして、何よりも問題なのはその呼び出し順番です。
はじめに、Baseのコンストラクタが呼ばれます。これは良いですね。そして、
Baseコンストラクタの中では、virtualなHogeメソッドを呼んでいます。する
と、overrideされたHogeメソッドが呼ばれるのですが、なんと、
”DelivedClassのコンストラクタが呼び出されないうちに、DelivedClassの
Hoge()メソッドが呼び出されてしまいます。”
これは、明らかにおかしな動きです。もし、Hogeメソッドの中で、フィールド
にアクセスしていたとしたら、初期化されていないフィールドにアクセスする
ことになってしまいます。
このように、コンストラクタの中で、仮想メソッドを呼び出すことは大変危険
なコードです。
■ 参照MSDNページ
CA2214: オーバーライドできるメソッドをコンストラクタで呼び出さないで
ください
http://msdn.microsoft.com/ja-jp/library/ms182331.aspx
───────────────────────────────────
『C#プログラミングレッスン』 (ぼぼ週刊)
───────────────────────────────────
Published by Gushwell.
Copyright (C) 2004-2009 Gushwell All rights reserved.
Microsoft MVP - Visual C#(Apr 2005 - Mar 2010)
<<■ Gushwell's Page ■>>
窓際プログラマ─の独り言 :http://gushwell.ldblog.jp/
窓際プログラマ─の読書三昧:http://gushwell.jugem.jp/
Gushwell's F# Programming Diary : http://techbank.jp/gushwell/
Gushwell's C# Programming Page :http://gushwell.ifdef.jp/
C#デザインパタ─ン : http://gushwell.ifdef.jp/dp/csdpindex.html
☆メールマガジンの感想お待ちしています☆
http://gushwell.ifdef.jp/mail.html
<<■ コミュニティtechbank.jp (http://techbank.jp/Community/) ■>>
Gushwellが参加している技術系コミュニティです。
マイクロソフト系テクノロジー&製品に特化したコミュニティで、Webサイト
では、VB、C#、VC++、SQL Server, BizTalk Server などの技術情報を公開し
ています。皆さんの参加をお待ちしています。
ブロガーさんも募集中です。
───────────────────────────────────
最新の記事
このメルマガもおすすめ
-
Office & VBA パーフェクトマスター
- 最終発行日:
- 2012/02/08
- 読者数:
- 5878人
Excel・Access・Word等の今さら聞けない「疑問」、今すぐ知りたい「困った」、たちまち解決!のmoug(モーグ)がお送りする、関数初心者からVBA手練の方への+1テクニックメールマガジン!読めば納得の情報マガジンです。
-
ネットワークエンジニア
- 最終発行日:
- 2011/11/21
- 読者数:
- 350人
ネットワークエンジニアはコンピュータでソフトウェアを開発する時、参考にできるC・VC言語の情報マガジンす。
-
知って得する!パソコン知識
- 最終発行日:
- 2012/02/06
- 読者数:
- 7930人
パソコンに関する操作、裏技、知識を一日一配信一解説します。毎日購読すればあなたもパソ通です。
-
全部フリーソフト!!
- 最終発行日:
- 2012/02/09
- 読者数:
- 5234人
ネット上にはこんなに便利なソフトがいっぱい。仕事にも、遊びにも、あると絶対にお得で楽しいソフトを1つずつご紹介します。
-
VisualBasic エンジニア
- 最終発行日:
- 2011/11/22
- 読者数:
- 339人
VisualBasic エンジニアはコンピュータでソフトウェア開発をするためにVisualBasic 言語・Basic 言語・スクリプトなど、様々な言語を題材に多くの使用方法・プログラミングテクニックをお送りするマガジンです。
発行者プロフィール
- 2009/12/15
- 2009/12/8
- 2009/12/2
- 2009/11/24
- 2009/11/17
- 2009/11/3
- 2009/10/27
- 2009/10/20
- 2009/10/13
- 2009/10/6
- 2009/9/29
- 2009/9/24
- 2009/9/15
- 2009/9/8
- 2009/9/1
- 2009/8/18
- 2009/8/11
- 2009/8/4
- 2009/7/29
- 2009/7/21
- 2009/7/14
- 2009/7/7
- 2009/6/30
- 2009/6/23
- 2009/6/16
- 2009/6/9
- 2009/6/3
- 2009/6/1
- 2009/5/12
- 2009/4/28
- 2009/4/21
- 2009/4/14
- 2009/4/7
- 2009/3/31
- 2009/3/24
- 2009/3/17
- 2009/3/10
- 2009/3/3
- 2009/2/28
- 2009/2/24
- 2009/2/10
- 2009/2/3
- 2009/1/27
- 2009/1/6



