C#中构造函数内的静态成员

时间:2013-02-01 08:45:36

标签: c# oop variables static

通常我们知道为了访问 static 变量,我们不需要创建类的实例。我们可以直接像classname.staticvariable那样做。并且为了访问类中的静态变量,我们应该有一个静态方法。

现在我怀疑以下代码片段

public class xyz
{
    private static int a;

    public xyz()
    {
        a++;
    }
}

以上代码段是否有效?如果是,为什么,如果没有原因?

由于 Prabhanjan

8 个答案:

答案 0 :(得分:4)

是的,它会。 int的默认值为0.每次调用构造函数时,都会增加静态变量。

答案 1 :(得分:2)

有效。

想象一下,您想知道已创建了多少个类实例。所以在这种情况下你可以使用

xyz.a 

另外,要监视生存实例的数量,您可以创建析构函数并使用a--

答案 2 :(得分:2)

引用C# documentation on static variables

  

在访问静态成员之前初始化静态成员   第一次和静态构造函数之前,如果有一个,   被称为。

例如,运行以下示例程序:

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. 在StaticDemo的静态构造函数之前调用'Console.WriteLine(“Create StaticDemo A”)'行。
  2. “Console.WriteLine(”静态构造函数“)行只会被调用一次。
  3. 即使staticDemo1从未显式初始化,'Console.WriteLine(“staticDemo1 {0}”,staticDemo1)'也能正常工作。
  4. staticDemo1,staticDemo2和staticDemo 3的值均为0。
  5. 最后作为子注释,如果要在多个线程上创建对象,则需要小心。这是因为classNumber ++不是原子操作。它算作一个读取和一个写入的两个单独操作。因此,两个单独的线程都可以在其中任何一个写出增量值之前读取变量。要避免这种情况,请改用此行:

    System.Threading.Interlocked.Increment(ref classNumber);
    

答案 3 :(得分:1)

从实例方法访问静态成员是完全正确的。

静态变量a的默认值为0,每次创建类的实例时,您的代码都会增加它。

答案 4 :(得分:0)

以上代码段完美无缺。编写这种代码来计算一个类的实时实例数。

public class xyz
{
    private static int a;

    public xyz()
    {
        a++;
    }

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

将实时实例的数量打印为:

Console.WriteLine(obj.A);

答案 5 :(得分:0)

以下假设不正确;

  

为了访问我们应该拥有的类中的静态变量   静态方法。

您提供的代码可以使用,因为您不需要静态方法。

尝试以下操作,你会发现它也有效;

public class xyz
{
    private static int a;

    public void A()
    {
        a++;
    }
}

答案 6 :(得分:0)

是的,它会起作用。您可以在实例成员中引用静态成员,但不能引用静态成员中的实例成员,因为它们需要实例才能工作而静态则不需要。

答案 7 :(得分:0)

它不起作用 如果要访问静态var,则必须将其公开 和 构造函数方法不会运行,因为构造函数在您使用初始化类并创建对象时运行。