通常我们知道为了访问 static 变量,我们不需要创建类的实例。我们可以直接像classname.staticvariable
那样做。并且为了访问类中的静态变量,我们应该有一个静态方法。
现在我怀疑以下代码片段
public class xyz
{
private static int a;
public xyz()
{
a++;
}
}
以上代码段是否有效?如果是,为什么,如果没有原因?
由于 Prabhanjan
答案 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
这里有一些有趣的事情需要注意:
最后作为子注释,如果要在多个线程上创建对象,则需要小心。这是因为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,则必须将其公开 和 构造函数方法不会运行,因为构造函数在您使用初始化类并创建对象时运行。