在c#中创建共享静态字段

时间:2014-04-01 22:52:33

标签: c# oop

我遇到的问题是在实例类中创建静态的共享字段。我要展示的代码完美无缺。我真正想要掌握的是逻辑背后的理解。这是一个代码片段,它是一个非常基本的类,它是一个从这个类创建对象并在屏幕上显示已创建了多少个对象的方法。

public class Counter
{
private int value;
private static int ValueCounter = 0;

public Counter()
{
    value = ValueCounter;
    ValueCounter++;
}

public static int objectCount()
{
    return ValueCounter;
}
}

以上是一个非常基本的工人阶级。我试图让它尽可能简单和基本,以便我理解它。

下面是创建类实例的代码片段,并在屏幕上显示已创建的实例数。

private static void showObjectCounter()
    {
        Counter val1 = new Counter();
        Counter val2 = new Counter();
        Counter val3 = new Counter();
        Counter val4 = new Counter();

        int totalValue = Counter.objectCount();
        Console.WriteLine("Total objects created = {0}", totalValue);
    }

现在这是关于此事的问题。创建新对象时,value字段独立于每个实例,因此每个对象都有自己的副本。但是,静态字段是共享字段,并随着对象的每次新创建而递增。我想知道在每次创建新对象后是否保存了这个增量值,即创建了一个对象,值增加到1,然后创建另一个对象,增量的最后一个值为1,所以现在它增加到2并且等等,为每个新对象创建。

或者,每个创建的新对象是否增加到1然后全部加在一起以查找创建的对象的总值?

这是一个非常基本而简单的问题,但是由于时间的推移,我与自己争论是错误或错误的概率。无论如何,如果有人对一个非常简单的问题有一个简单的答案,那么请随时分享。

感谢。

3 个答案:

答案 0 :(得分:1)

它实际上是一个共享值,因此每次构造函数运行时,无论何时访问该变量,该值都会递增1。您可以自己验证:

private static void showObjectCounter()
{
    Counter val1 = new Counter();
    Console.WriteLine("Total objects created = {0}", Counter.objectCount());
    Counter val2 = new Counter();
    Console.WriteLine("Total objects created = {0}", Counter.objectCount());
    Counter val3 = new Counter();
    Console.WriteLine("Total objects created = {0}", Counter.objectCount());
    Counter val4 = new Counter();
    Console.WriteLine("Total objects created = {0}", Counter.objectCount());
}

每次都会看到值发生变化。

答案 1 :(得分:1)

使用一些传统的命名和编码风格可能会对你有帮助。

  • 使用this作为实例变量
  • 使用C#Property代替getter / setter方法
  • 不要将this用于静态变量
  • 稍微更具描述性的命名

样品:

public class Counter
{
    public int Count { get; }

    private static int instanceCounter = 0;
    public static int InstanceCount
    {
        get
        {
            return instanceCounter;
        }
    }

    public Counter()
    {
        this.Count = instanceCounter;
        instanceCounter++;
    }
}

答案 2 :(得分:0)

在您的示例中,内存中只有一个与ValueCounter变量对应的物理位置。

相比之下,非静态value字段存储在每个实例的对象数据中。