Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中构造函数内部的静态成员#_C#_Oop_Variables_Static - Fatal编程技术网

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

C# C中构造函数内部的静态成员#,c#,oop,variables,static,C#,Oop,Variables,Static,通常我们知道,为了访问静态变量,我们不需要创建类的实例。我们可以直接像classname.staticvariable这样做。为了访问类中的静态变量,我们应该有一个静态方法 现在我对下面的代码片段有疑问 public class xyz { private static int a; public xyz() { a++; } } 上面的代码片段可以工作吗?如果是,为什么?如果不是,为什么 谢谢 普拉班詹是的,会的。int的默认值为0。每次调用

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

现在我对下面的代码片段有疑问

public class xyz
{
    private static int a;

    public xyz()
    {
        a++;
    }
}
上面的代码片段可以工作吗?如果是,为什么?如果不是,为什么

谢谢
普拉班詹

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

从实例方法访问静态成员完全可以


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

上述代码片段将很好地工作。编写此类代码是为了计算类中存在的活动实例的数量

public class xyz
{
    private static int a;

    public xyz()
    {
        a++;
    }

    public static int A
    {
        get { return a;}
    }
}
将活动实例的数量打印为:

Console.WriteLine(obj.A);
它起作用了

假设您想知道一个类已经创建了多少个实例。因此,在这种情况下,您可以使用

xyz.a 

此外,为了监视活动实例的数量,您可以创建析构函数并使用--

以下假设是不正确的

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

您提供的代码可以工作,因为您不需要静态方法

试试下面的方法,你会发现它同样有效

public class xyz
{
    private static int a;

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

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

它不工作 如果您想访问静态var,必须将其标记为public 及 构造函数方法不会运行,因为构造函数在您使用初始化类和创建对象时运行

引自:

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

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

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);                  
      }      
   }
}
这里有一些有趣的事情需要注意:

  • 在StaticDemo的静态构造函数之前调用行“Console.WriteLine(“Create StaticDemo A”)”
  • 行“Console.WriteLine(“静态构造函数”)”只被调用一次
  • 即使staticDemo1从未被显式初始化,行“Console.WriteLine”(“staticDemo1{0}”,staticDemo1)仍然可以工作
  • staticDemo1、staticDemo2和StaticDemo3的值均以0开头 最后,作为补充说明,如果要在多个线程上创建对象,则需要小心。这是因为classNumber++不是原子操作。它算作两个独立的操作,一个读操作,一个写操作。因此,两个独立的线程都可以在其中一个线程写出递增的值之前读取变量。要避免这种情况,请使用此行:

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


    行吗?你有一个编译器。试试看。显然,更快地发到。这是另一种方式。当允许在非静态方法中使用静态变量时,您不能在静态方法中使用非静态变量(但您需要记住并发性问题)。请注意,
    a
    在使用线程时并不总是包含创建的
    xyz
    。多个线程可以一次访问该变量并留下不可预测的结果。请解释何时将a设置为0。这将在CLR级别:)但是,一旦您点击了变量且该变量尚未初始化,它将获得其默认值。如果intOk被罚款,则为0,但我的问题是非静态成员函数(构造函数也是一个特殊的成员函数,没有任何返回类型,并且具有类名称)如何访问静态变量?静态成员对对象的任何实例都有效。它是一个每次访问对象时都相同的值。因此,非静态方法(构造函数)可以访问静态变量。但它将与该对象的所有其他实例共享。如果需要,您甚至可以编写一个静态方法来读取静态变量以获取其值,而无需创建对象。您甚至可以通过创建一个静态默认构造函数来将静态变量的默认值设置为另一个值,在该构造函数中,您可以指定一个自定义值。这很好,但是非静态成员函数(构造函数)是如何工作的呢是否能够访问静态成员?静态成员以某种方式在所有非静态成员(实例成员)之间共享-我不确定我是否理解你的问题-好的,那么静态变量是如何在非静态方法(构造函数)中被访问的?如何表示您在询问语法或原因?静态表示所有实例通用。为什么你认为它不能被访问?这就是为什么静态意味着所有实例都是公共的,以及如何在非静态成员函数中访问静态?为什么我不需要静态方法?@prabhankumarmahapatra,因为为了访问静态变量,您不需要将方法声明为静态的。但是,为什么非静态成员函数访问静态成员函数?在这种情况下,它是构造函数?您可以访问非静态方法中的静态变量。但另一种方式是不允许的。。这很管用,伙计。。。当然,tpeczek(在其中一条评论中)回答了它的工作原理,他希望在不初始化xyz类的情况下访问var“Private”a。他从类中的
    访问
    Private
    变量。这是正确的。静态变量是在第一次访问类时初始化的,因此变量将在使用
    实例构造函数之前初始化。这里没什么问题,只是你认识的另一个用户。。。tnx很多。
    
    System.Threading.Interlocked.Increment(ref classNumber);