web-dev-qa-db-ja.com

C#で静的変数の使用は何ですか?いつ使うの?メソッド内で静的変数を宣言できないのはなぜですか?

私はC#で静的変数について検索しましたが、まだその用途がわからないのです。また、メソッド内で変数を宣言しようとしても、それを許可することはできません。どうして?

静的変数についていくつかの例を見ました。変数にアクセスするためにクラスのインスタンスを作成する必要はないことを私は見ましたが、それはその使用が何であるか、そしていつそれを使うべきかを理解するのに十分ではありません。

第二のこと

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();

        Console.WriteLine(book.myInt); // Shows error. Why does it show me error?
                                       // Can't I access the static variable 
                                       // by making the instance of a class?

        Console.ReadKey();
    }
}
95
Kartik Patel

static変数は、クラスのすべてのインスタンス間でその値を共有します。

静的と宣言しない例

public class Variable
{
    public int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

説明:上記の例を見ると、int変数を宣言しているだけです。このコードを実行すると、出力は1010になります。それは簡単です。

それではここで静的変数を見てみましょう。変数をstaticとして宣言しています。

静的変数を使った例:

public class Variable
{
    public static int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

上のコードを実行すると、出力は1015になります。したがって、静的変数値はそのクラスのすべてのインスタンス間で共有されます。

158
Kartik Patel

C#は静的ではない変数。 C#を介して特定の型定義でstatic fieldを宣言できます。静的フィールドは、特定のタイプのすべてのインスタンスと共有される状態です。したがって、静的フィールドの範囲は全体型です。そのため、メソッド内でstatic fieldを宣言することはできません。メソッドはスコープそのものであり、メソッド内で宣言された項目はメソッドの境界を越えてアクセスできないようにする必要があります。

31
Dennis

静的変数は、変数のコピーが1つだけ必要な場合に使用されます。そのため、メソッド内で変数を宣言しても、そのような変数を使用することはできません。関数内でのみローカルになります。

静的の例は

class myclass
{
    public static int a = 0;
}

Staticと宣言された変数は、クラスのすべてのインスタンスで共通に使用されます。

Staticと宣言された変数は、クラスのすべてのインスタンスで共通に使用されます。 VariableTestクラスのインスタンスを複数作成すると、この変数パーマネントはすべてのインスタンスで共有されます。したがって、どの時点でも、永久変数に含まれる文字列値は1つだけです。

すべてのインスタンスで使用できる変数のコピーは1つだけなので、this.variablenameがインスタンス変数名を参照していることを思い出すことができるため、コードthis.permamentはコンパイルエラーになります。したがって、コードに示されているように、静的変数は直接アクセスされます。

17
Pranay Rana

静的変数のいくつかの「現実世界」の例:

アプリケーションのハードコードされた値に到達できるクラスを構築します。列挙型に似ていますが、データ型の柔軟性が向上しています。

public static class Enemies
{
    public readonly static Guid Orc = new Guid("{937C145C-D432-4DE2-A08D-6AC6E7F2732C}");
}

広く知られているシングルトン、これはクラスのちょうど1つのインスタンスを持つように制御することを可能にします。アプリケーション全体でアクセスしたいが、このクラスで使用できるようにするためだけにすべてのクラスに渡したくない場合は、これは非常に便利です。

public sealed class TextureManager
    {
        private TextureManager() {}
        public string LoadTexture(string aPath);

        private static TextureManager sInstance = new TextureManager();

        public static TextureManager Instance
        {
            get { return sInstance; }
        }
    }

これは、あなたがtexturemanagerを呼び出す方法です。

TextureManager.Instance.LoadTexture("myImage.png");

あなたの最後の質問について:あなたはコンパイラエラー CS0176 を参照しています。私はそれについてより多くの情報を見つけようとしましたが、msdnがそれについて言わなければならなかったものだけを見つけることができました:

クラスのインスタンスが作成されていない場合でも、静的メソッド、フィールド、プロパティ、またはイベントはクラスで呼び出すことができます。クラスのインスタンスが作成された場合、それらを使用して静的メンバーにアクセスすることはできません。静的フィールドと静的イベントのコピーは1つだけ存在し、静的メソッドと静的プロパティは静的フィールドと静的イベントにのみアクセスできます。

9
dowhilefor

静的クラスでは、そのクラスのオブジェクトを作成したりインスタンス化したりする必要はありません。クラス名の前にstaticというC#キーワードを付けることで、静的にすることができます。

覚えておいてください:Consoleクラス、Stringクラス、Arrayクラスはインスタンス化していません。

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();
       //Use the class name directly to call the property myInt, 
      //don't use the object to access the value of property myInt

        Console.WriteLine(Book.myInt);

        Console.ReadKey();

    }
}
3
Kunal Mukherjee

静的変数は、そのコピーが1つだけ必要な場合に使用されます。例を挙げて説明しましょう: -

class circle
        {
           public float _PI =3.14F;
           public int Radius;


           public funtionArea(int radius)
            {
                return this.radius * this._PI      
            }

        }
    class program
    {
      public static void main()
      {
       Circle c1 = new Cirle();
       float area1 = c1.functionRaduis(5);

       Circle c2 = new Cirle();
       float area2 = c1.functionRaduis(6);

      }

    }

これで、クラスサークルのインスタンスが2つ作成されました。つまり、_PIのコピーが他の変数とともに2セット作成されました。したがって、このクラスのインスタンスが多数ある場合は、メモリを占有する_PIの複数のコピーが作成されます。そのような場合は、_PIのような変数を静的にしてそれらを操作することをお勧めします。

    class circle
        {
           static float _PI =3.14F;
           public int Radius;


           public funtionArea(int radius)
            {
                return this.radius * Circle._PI      
            }

        }
    class program
    {
      public static void main()
      {
       Circle c1 = new Cirle();
       float area1 = c1.functionRaduis(5);

       Circle c2 = new Cirle();
       float area2 = c1.functionRaduis(6);

      }

    }

クラスサークルに対していくつのインスタンスが作成されても、メモリを節約するために変数_PIのコピーが1つだけ存在します。

2
TomHardy

この@Kartik Patelの例から始めて、私は少し変更しました多分今静的変数についてより明確です

 public class Variable
    {
        public static string StaticName = "Sophia ";
        public string nonStName = "Jenna ";
        public void test()
        {
            StaticName = StaticName + " Lauren"; 
            Console.WriteLine("  static ={0}",StaticName);
            nonStName = nonStName + "Bean ";
            Console.WriteLine("  NeStatic neSt={0}", nonStName);

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Variable var = new Variable();
            var.test();
            Variable var1 = new Variable();
            var1.test();
            Variable var2 = new Variable();
            var2.test();
            Console.ReadKey();

        }
    }

Output 
  static =Sophia  Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren Lauren
  NeStatic neSt=Jenna Bean
  1. C#のクラス変数とインスタンス変数

    静的クラスメンバC#ORクラス変数

    class A
    {
        // Class variable or " static member variable"  are declared with 
        //the "static " keyword
    
        public static int i=20;
        public int j=10;         //Instance variable 
        public static string s1="static class variable"; //Class variable 
        public string s2="instance variable";        // instance variable 
    }
    class Program
    {
        static void Main(string[] args)
        {
            A obj1 = new A();
    
            // obj1 instance variables 
            Console.WriteLine("obj1 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj1.j);
            Console.WriteLine(obj1.s2);
            Console.WriteLine(A.s1);
    
            A obj2 = new A();
    
            // obj2 instance variables 
            Console.WriteLine("obj2 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj2.j);
            Console.WriteLine(obj2.s2);
            Console.WriteLine(A.s1);
    
            Console.ReadKey();
    
        }
    
    
    }
    

    }

enter image description hereenter image description hereenter image description hereenter image description here

https://en.wikipedia.org/wiki/Class_variable

https://en.wikipedia.org/wiki/Instance_variable

https://en.wikipedia.org/wiki/Static_variable

https://javaconceptoftheday.com/class-variables-and-instance-variables-in-Java/?fbclid=IwAR1_dtpHzg3bC5WlGQGdgewaTvuOI6cwVeFUtTV8IZuGTj1qH5PmKGwX0yM

https://docs.Microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

1
leonidaa

型のインスタンスを操作するデータメンバと関数メンバは、インスタンスメンバと呼ばれます。たとえば、intのToStringメソッドはインスタンスメンバーの例です。デフォルトでは、メンバーはインスタンスメンバーです。型のインスタンスではなく、型自体では操作しないデータメンバーと関数メンバーは、静的としてマークする必要があります。 Test.MainメソッドとConsole.WriteLineメソッドは静的メソッドです。 Consoleクラスは、実際には静的クラスです。つまり、そのすべてのメンバは静的です。実際にはコンソールのインスタンスを作成することはありません。1つのコンソールがアプリケーション全体で共有されます。

1
MichaelY

「いつ使うの?」に答えて質問:

クラスのすべてのインスタンスに一意のインスタンスIDを割り当てるために、静的(クラス)変数を使用することがよくあります。私はすべてのクラスで同じコードを使っています、それはとても簡単です:

//Instance ID ----------------------------------------
    // Class variable holding the last assigned IID
    private static int xID = 0;
    // Lock to make threadsafe (can omit if single-threaded)
    private static object xIDLock = new object();
    // Private class method to return the next unique IID 
    //  - accessible only to instances of the class
    private static int NextIID()                    
    {
        lock (xIDLock) { return ++xID; }
    }
    // Public class method to report the last IID used 
    // (i.e. the number of instances created)
    public static int LastIID() { return xID; }
    // Instance readonly property containing the unique instance ID
    public readonly int IID = NextIID();
//-----------------------------------------------------

これは、静的変数とメソッドに関するいくつかの点を示しています。

  1. 静的変数とメソッドはクラスに関連付けられています。クラスの特定のインスタンスではありません。
  2. インスタンスのコンストラクタ内で静的メソッドを呼び出すことができます。この場合、静的メソッドNextIIDは読み取り専用プロパティIIDを初期化するために使用されます。これは、このインスタンスの一意のIDです。

私はこれが便利だと思います。なぜなら、私はオブジェクトの集まりが使用されるアプリケーションを開発するので、いくつのオブジェクトが作成されたかを追跡でき、個々のインスタンスを追跡/照会できるのが良いからです。

また、クラス変数を使用して、インスタンスのプロパティの合計や平均など、リアルタイムでレポートできるものを追跡します。私はそのクラスがそのクラスのすべてのインスタンスに関する要約情報を保持するのに適した場所だと思います。

1
JohnRC

クラス名Book.myIntで直接呼び出してみてください

0
Arnold Parge

セッション変数と比較すると、静的変数は、サーバーにデプロイされているアプリケーションを使用していることを考慮すると、すべてのユーザーにとって同じ値になります。 2人のユーザーがアプリケーションの同じページにアクセスすると、静的変数は最新の値を保持し、ユーザーごとに異なるセッション変数とは異なり、両方のユーザーに同じ値が提供されます。そのため、アプリケーションコードに沿って使用されることになっている値を含め、すべてのユーザーに共通で同じものが必要な場合は、staticのみを使用します。

0
pratham gn

Yauは静的変数を使用するので、オブジェクトをインスタンス化する必要はありません。Console.WriteLine(Book.myInt);

0
Mehran Sarrafi