C#


CSHARP.CLASS.STATICMOD : Static Field Assigned Non-Static (C#)

要旨

A static field has been modified from a non-static method.

Static fields can be updated from a static context, but this is a bad programming practice:

In object-oriented code, fields should mostly be instance fields; static fields should be used in rare situations, such as for constants. This checker looks for static fields that are assigned from non-static contexts. It only considers as acceptable assignments that are used for the lazy initialization of static fields, although they might occur in non-static contexts. That is current programming practice.

プロパティ

クラス名 Static Field Assigned Non-Static (C#)
日本語クラス名 Static Field Assigned Non-Static (C#)
クラス分類 信頼性 (reliability)
ニーモニック CSHARP.CLASS.STATICMOD
カテゴリー
CWE CWE:1164 Irrelevant Code
対応言語 C# で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで有効になっています。チェックを無効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += discard class="Static Field Assigned Non-Static (C#)"

using System;
using System.Collections;
using System.Collections.Generic;

namespace DocumentationExamples
{

    public class StaticFieldAccess1
    {
        private static int[] scores = new int[100];
        private static int next;
        public static void Main(string[] args)
        {
            new StaticFieldAccess1();
        }
        public void AddScore(int score)
        {
            if (next < scores.Length)
                scores[next++] = score;                       // Two "Static Field Assigned Non-Static (C#)" warnings issued here:
                                                              // - one for 'next' 
                                                              // - one for 'scores' 
        }
        public float Average()
        {
            float sum = 0.0f;
            for (int pos = 0; pos < next; pos++)
                sum += scores[pos];
            return sum / next;
        }
    }

    public class StaticFieldAccess2
    {
        private static IDictionary session;
        private static IDictionary session2;
        public IDictionary GetSession()
        {
            if (session == null)
            {
                Console.WriteLine("Initializing session");
                session = new Dictionary<string, string> ();                             // ok: correct lazy initialization idiom
            }
            return session;
        }
        public IDictionary GetSession2()
        {
            if (session == null)                                                               // The programmer probably intended to check session2 here
            {
                Console.WriteLine("Initializing session2");
                session2 = new Dictionary<string, string> (); // "Static Field Assigned Non-Static (C#)" warning issued here
            }
            return session2;
        }
    }
}

In this example, the programmer should replace the static fields with instance fields:

  private int[] scores = new int[100];
  private int next;

解決法

Check if static fields can be replaced by instance fields or if methods can be made static.

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。