LoginSignup
1
1

More than 3 years have passed since last update.

CA1501: 参照できるインスタンス フィールドを宣言しないでください とは何か

Posted at

Pipelineによる自動ビルド&デプロイを組み始めると、警告メッセージを1つでも多く消したくなってきます。
その中で、マイクロソフトの文章を読んでも、さっぱり何を言ってるか分からなかったメッセージについてメモしておきます。

【発生環境】

  • Visual Studio 2019
  • C# 8.0

CA1051: 参照できるインスタンス フィールドを宣言しないでください

特に思想があるわけではないのですが、継承クラス共通で利用するモノを私は基底クラスにこんな風にreadonlyのprotectedフィールドとして書く癖がありました。
最初にprivate readonlyのフィールドとして定義したものを共通化で移動していくウチにこうなったんだと思います。

public abstract class SampleBase
{
    protected readonly ILogger _logger;

    public SampleBase(ILogger logger)
    {
        _logger = logger
    }
}

ところが、これがよろしくないらしく、

CA1051: 参照できるインスタンス フィールドを宣言しないでください

と警告されます。

マイクロソフトの公式ドキュメントを読むと

フィールドの主な用途は、実装の詳細にする必要があります。 フィールドは private または internal である必要があり、プロパティを使用して公開する必要があります。 フィールドにアクセスするのと同じように、プロパティにアクセスするのは簡単です。プロパティのアクセサーのコードは、互換性に影響する変更を導入しなくても、型の機能が拡張されると変化することがあります。

(以下略)・・・とあり、日本語が難しすぎて、何を言ってるか分かりません。

話は単純で、フィールドとは自クラス内なので、protectedやpublicにするんじゃねぇって警告です。

では先ほどのサンプルコードはどう修正すればいいかというと、こんな風にゲッターしかないプロパティを定義すれば解決です。

public abstract class SampleBase
{
    protected ILogger Logger {get;}

    public SampleBase(ILogger logger)
    {
        Logger = logger
    }

    // セッターがないのでこれは怒られる
    private void Set(ILogger logger){
        Logger = logger;
    }
}

それにしてももう少し公式ドキュメントが分かりやすくならないものか・・・

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1