トップ > コンピュータ > プログラム > C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。 

RSS

メルマガの登録・解除

登録した方には、メルマ!からオフィシャルメルマガ(無料)をお届けします。

【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 などの技術情報を公開し
 ています。皆さんの参加をお待ちしています。
 ブロガーさんも募集中です。
───────────────────────────────────

最新の記事

ブックマークに登録する

TwitterでつぶやくLismeトピックスに追加するはてなブックマークに追加del.icio.usに追加Buzzurlにブックマークニフティクリップに追加ライブドアクリップに追加Yahoo!ブックマークに登録記事をEvernoteへクリップ
My Yahoo!に追加Add to Google

規約に同意してこのメルマガに登録/解除する

登録した方には、メルマ!からオフィシャルメルマガ(無料)をお届けします。

この記事へのコメント

コメントを書く


上の画像で表示されている文字を半角英数で入力してください。

コメントの投稿時は投稿者規約への同意が必要です。

  1. コメントはありません。

このメルマガもおすすめ

  1. Office & VBA パーフェクトマスター

    最終発行日:
    2012/02/08
    読者数:
    5878人

    Excel・Access・Word等の今さら聞けない「疑問」、今すぐ知りたい「困った」、たちまち解決!のmoug(モーグ)がお送りする、関数初心者からVBA手練の方への+1テクニックメールマガジン!読めば納得の情報マガジンです。

  2. ネットワークエンジニア

    最終発行日:
    2011/11/21
    読者数:
    350人

    ネットワークエンジニアはコンピュータでソフトウェアを開発する時、参考にできるC・VC言語の情報マガジンす。

  3. 知って得する!パソコン知識

    最終発行日:
    2012/02/06
    読者数:
    7930人

    パソコンに関する操作、裏技、知識を一日一配信一解説します。毎日購読すればあなたもパソ通です。

  4. 全部フリーソフト!!

    最終発行日:
    2012/02/09
    読者数:
    5234人

    ネット上にはこんなに便利なソフトがいっぱい。仕事にも、遊びにも、あると絶対にお得で楽しいソフトを1つずつご紹介します。

  5. VisualBasic エンジニア

    最終発行日:
    2011/11/22
    読者数:
    339人

    VisualBasic エンジニアはコンピュータでソフトウェア開発をするためにVisualBasic 言語・Basic 言語・スクリプトなど、様々な言語を題材に多くの使用方法・プログラミングテクニックをお送りするマガジンです。

発行者プロフィール

Gushwell

Gushwell

http://gushwell.ifdef.jp/

Microsoft MVP for Visual C# を7年連続で受賞しています。

過去の発行記事