4

私はc#でクラスを書いていました。

私は、コードリファクタによって提供されたこの提案についてつまずいた。そして私はしなかった

それがこの提案/改善を提供したときにツールが正確に何を意味したかを手に入れてください。

状況 :

私のFormクラスのコンストラクタでタイトルを設定するのにthis.Textプロパティを使っていました。

Form()
{
   //some initialization code ...

   //...

   this.Text = "Non modal form";           //Suggestion offered here..
}

コードリファクタリングツールから警告が表示されました。仮想メンバーへのアクセスです

これを修正するために、ツールは自動的にプロパティを追加しました

  public override sealed string Text
   {
        get { return base.Text; }
        set { base.Text = value; }
   } 

誰もが私に説明することができますか、密封されたプロパティを追加すると状況に影響を与える/改善することができます。

乾杯

4 답변


5

あなたはコンストラクタで仮想メンバを呼び出しています。クラスが継承され、そのプロパティが呼び出された場合にあなたのコードが実行されるという保証人はいません。それを封印すると、子クラスでは上書きできないため、これを防ぎます。これは、この特定の例では何も影響しません。



1

派生クラスができないのでそれは役立ちますoverrideそれ。


1

あなたが扱っているようにFormもう1つの選択肢は、初期化コードをLoadイベントハンドラ(Jon Skeetによる記述のとおり)ここに):

Load += delegate
{
    this.Text = "Non modal form";  
};

特に複数の仮想プロパティにアクセスしている場合は、Loadイベントを使用する方が封印されたプロパティを作成するよりもはるかに簡単です。


1

あなたが設定しているのでvirtualあなたのコンストラクタのプロパティでは、リファクタリングツールはプロパティが継承クラスでは値を変更できません継承クラスではオーバーライドできません。

これはパフォーマンスを向上させるものではなく、またあなたが持っているシナリオでは意味がありません。Formそれを無視します


  • これは継承されたクラスがプロパティの値を変更することを妨げません。継承されたクラスが動作プロパティの。 - Adam Robinson
  • また、コンストラクター内から仮想メンバーを呼び出すのは不適切な方法であるため、ここで推奨されています。まだ作成されていないクラス(継承クラス)でコードを実行する可能性があるためです。 - Adam Robinson
  • これは基本クラスでオーバーライドすることはできません、これはbaheviourではありません? - Aliostad
  • あなたが何を求めているのかよくわかりません。あなたの答えは、「継承されたクラスで値が変更されないように」と提案していると述べています。継承クラスは確実に値を変更できます。これは、パブリックセッターを持つパブリックプロパティです。継承されたクラスが封印されたときに継承できないことは、動作を上書きすることです。 - Adam Robinson
  • はい、コンストラクタで仮想メソッドを呼び出すのは悪いですが、これはWindowsフォームで行われていることではありませんInitiliseComponents?したがって、この文脈(これは厳密にネストされた階層ではありません)では無視します。 - Aliostad

リンクされた質問


関連する質問

最近の質問