2

通常、静的変数にアクセスするためにクラスのインスタンスを作成する必要がないことはわかっています。のように直接行うことができますclassname.staticvariable。クラス内の静的変数にアクセスするには、静的メソッドが必要です。

今、私は次のコードスニペットに疑問を持っています

public class xyz
{
    private static int a;

    public xyz()
    {
        a++;
    }
}

上記のコード スニペットは機能しますか? はいの場合はなぜ、いいえの場合はなぜですか?

ありがとうプラバンジャン

4

8 に答える 8

4

はい、そうなります。intのデフォルト値は0です。コンストラクターが呼び出されるたびに、静的変数を増やします。

于 2013-02-01T08:47:43.720 に答える
2

静的変数に関するC#ドキュメントから引用するには:

静的メンバーは、静的メンバーに初めてアクセスする前、および静的コンストラクター(存在する場合)が呼び出される前に初期化されます。

たとえば、次のサンプルプログラムを実行します。

using System;

namespace ScrapCSConsole
{
   class ScrapCSConsole
   {
      public static void Main()
      {
         Console.WriteLine("Create StaticDemo A");
         StaticDemo a = new StaticDemo();
         Console.WriteLine("Create StaticDemo B");
         StaticDemo b = new StaticDemo();
         Console.WriteLine("Done");
      }
   }

   class StaticDemo
   {
      private static int staticDemo1;
      private static int staticDemo2 = 0;
      private static int staticDemo3 = default(int);
      private static int staticDemo4;
      private static int classNumber;

      /// <summary>
      /// Static Constructor
      /// </summary>
      static StaticDemo()
      {
         Console.WriteLine("Static Constructor");
         Console.WriteLine("staticDemo1 {0}", staticDemo1);
         staticDemo4 = (new DateTime(1999, 12, 31)).DayOfYear;
      }

      /// <summary>
      /// Instance Constructor
      /// </summary>    
      public StaticDemo()
      {
         classNumber++;
         Console.WriteLine("classNumber {0}", classNumber);
         Console.WriteLine("staticDemo2 {0}", staticDemo2);
         Console.WriteLine("staticDemo3 {0}", staticDemo3);
         Console.WriteLine("staticDemo4 {0}", staticDemo4);                  
      }      
   }
}

そして、次の出力が得られます。

Create StaticDemo A
Static Constructor 
staticDemo1 0
classNumber 1
staticDemo2 0
staticDemo3 0
staticDemo4 365
Create StaticDemo B
classNumber 2
staticDemo2 0
staticDemo3 0
staticDemo4 365
Done

ここで注意すべきいくつかの興味深いことがあります:

  1. 行'Console.WriteLine( "Create StaticDemo A")'は、StaticDemoの静的コンストラクターの前に呼び出されます。
  2. 行'Console.WriteLine( "Static Constructor")'は1回だけ呼び出されます。
  3. 行'Console.WriteLine( "staticDemo1 {0}"、staticDemo1)'は、staticDemo1が明示的に初期化されていない場合でも機能します。
  4. staticDemo1、staticDemo2、およびstaticDemo 3はすべて、値が0として始まります。

最後に、サブノートとして、複数のスレッドでオブジェクトを作成する場合は注意が必要です。これは、classNumber++が不可分操作ではないためです。これは、読み取りと書き込みの2つの別々の操作としてカウントされます。そのため、2つの別々のスレッドは、どちらかが増分値を書き出す前に、両方とも変数を読み取ることができます。この状況を回避するには、代わりに次の行を使用してください。

System.Threading.Interlocked.Increment(ref classNumber);
于 2013-02-01T09:32:39.530 に答える
2

できます。

クラスのインスタンスがいくつ作成されたか知りたいと想像してください。したがって、この場合、使用できます

xyz.a 

また、生きているインスタンスの数を監視するには、デストラクタを作成して使用できますa--

于 2013-02-01T08:49:24.573 に答える
1

インスタンスメソッドから静的メンバーにアクセスすることはまったく問題ありません。

静的変数aのデフォルト値はで0あり、クラスのインスタンスを作成するたびにコードがそれをインクリメントします。

于 2013-02-01T08:47:52.153 に答える
0

上記のスニペットは完全に正常に機能します。このような種類のコードは、クラスに存在するライブインスタンスの数をカウントするために記述されています。

public class xyz
{
    private static int a;

    public xyz()
    {
        a++;
    }

    public static int A
    {
        get { return a;}
    }
}

ライブインスタンスの数を次のように出力します。

Console.WriteLine(obj.A);
于 2013-02-01T08:48:27.440 に答える
0

静的変数にアクセスする場合は機能しません。パブリックにデカールする必要があり、コンストラクターメソッドは実行されません。これは、クラスの初期化とオブジェクトの作成を使用するとコンストラクターが実行されるためです。

于 2013-02-01T09:10:33.853 に答える
0

次の仮定は正しくありません。

クラス内の静的変数にアクセスするには、静的メソッドが必要です。

静的メソッドは必要ないため、提供したコードは機能します。

以下を試してみると、それも機能することがわかります。

public class xyz
{
    private static int a;

    public void A()
    {
        a++;
    }
}
于 2013-02-01T08:50:22.603 に答える
0

はい、動作します。インスタンスメンバーで静的メンバーを参照できますが、静的メンバーでインスタンスメンバーを参照することはできません。これは、インスタンスが機能する必要があり、静的メンバーが必要ないためです。

于 2013-02-01T08:52:55.567 に答える