113

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();
    }
}
4

13 に答える 13

179

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

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変数を宣言しているだけです。このコードを実行すると、出力は10andになり10ます。それは簡単です。

ここで静的変数を見てみましょう。変数を として宣言しています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();
    }
}

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

于 2012-05-29T09:54:35.257 に答える
36

C#は、静的ローカル変数(つまり、メソッドスコープで宣言された変数)をサポートしていません。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members#static-members

ただし、静的フィールド(クラスメンバー)を宣言することはできます。

理由:静的フィールドは状態であり、特定のタイプのすべてのインスタンスと共有されます。したがって、静的フィールドのスコープはタイプ全体です。そのため、(メソッド内で)静的インスタンス変数を宣言することはできません。メソッドはスコープ自体であり、メソッドで宣言されたアイテムは、メソッドの境界を越えてアクセスできない必要があります。

于 2012-05-29T08:48:05.080 に答える
21

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

静的の例は

class myclass
{
    public static int a = 0;
}

static と宣言された変数は、クラスのすべてのインスタンスで共有されます。

static と宣言された変数は、クラスのすべてのインスタンスで共有されます。VariableTest クラスの複数のインスタンスを作成する場合、この変数 permanent はそれらすべてで共有されます。したがって、任意の時点で、永続変数に含まれる文字列値は 1 つだけになります。

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

于 2012-05-29T08:24:50.400 に答える
9

静的変数の「実世界」の例:

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

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つだけ存在し、静的メソッドとプロパティは静的フィールドと静的イベントにのみアクセスできます。

于 2012-05-29T08:36:07.267 に答える
9

静的変数は、そのコピーが 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);
    }
}

ここで、classcircle の 2 つのインスタンスを作成しました。つまり、 の 2 セットのコピー_PI と他の変数が作成されます。したがって、このクラスのインスタンスが多数ある場合、_PIメモリを占有する複数のコピーが作成されるとします。したがって、そのような場合は、そのような変数を like_PI staticにして操作する方がよいでしょう。

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);
    }
}

classこれで、 circleに対していくつのインスタンスが作成されても_PI、メモリを節約する変数のコピーは 1 つしか存在しません。

于 2019-01-08T16:44:46.477 に答える
5

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

覚えておいてください: 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();

    }
}
于 2016-11-18T08:01:18.630 に答える
2

この@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# のクラス変数 VS インスタンス変数

    静的クラス メンバー C# またはクラス変数

    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();
    
        }
    
    
    }
    

    }

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

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/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

于 2018-12-13T23:27:16.870 に答える
1

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

于 2016-04-29T05:38:44.980 に答える
0

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

于 2016-08-23T14:02:05.903 に答える
-1

静的変数は、プログラムが終了するまで以前の値を保持します。static は、class_Name.Method() または class_Name.Property を直接呼び出すことによって使用されます。オブジェクト参照は必要ありません。static の最も一般的な使用法は、C# の Math クラスです。Math.Sin()、Math.Cos()、Math.Sqrt()。

于 2017-01-04T20:27:55.800 に答える