C#静态成员不在数组中添加

时间:2014-03-17 15:35:26

标签: c#

我正在学习C#,并且通过一些在线教程作为其中的一部分。我有时会稍微偏离教程,看看我是否能真正掌握所提出的想法。

我创建了一个测试程序,该程序创建了一个我定义的类的数组,名为" Machine。"一个类成员是 static int ,用于跟踪类初始化的次数。

绑定到 static int 的方法在类构造函数中,每次调用构造函数时,它都会向 static int 添加一个。那么,我希望每次在我的数组中初始化类时, static int 增加1。然而,实际结果表明它根本没有增加。

代码和结果位于底部。

在了解静态成员时,我认为静态成员"在静态成员第一次被访问之前和静态构造函数(如果有的话)之前被初始化,被称为" (来自MSDN' s Static Classes and Static Class Members (C# Programming Guide))。如果是这样,这个布局不应该起作用吗?感谢您提出任何意见或建议。

代码:

using System;

public class Machine
{
  public string model {get; set;}
  public int hours {get; set;}
  public static int num = 0;

  public Machine() // constructor
  {
    model = "Cat";
    hours = 0;
    num = num ++; // count how many times class initialized
  }

  public void display() // display method
  {
    Console.WriteLine("Machine #{0} Info: Model: {1}, Hours: {2}",
    num, model, hours.ToString());
  }
}

public class PMScheduler
{
  public static void Main()
  {
    int fleetnum = 5, i;
    Machine[] mymach = new Machine[fleetnum]; // declare

    // initialize the array
    for (i=0; i < fleetnum; i++)
    {
      mymach[i] = new Machine();
    }

    // set the values on the first two
    mymach[0].model = "RJS";
    mymach[0].hours = 1000;
    mymach[1].model = "REX";
    mymach[1].hours = 2000;

    // display all
    foreach (Machine mymach_i in mymach)
    {
      mymach_i.display();
    }

    Console.ReadKey();
  }
}

输出:

Machine #0 Info: Model: RJS, Hours: 1000
Machine #0 Info: Model: REX, Hours: 2000
Machine #0 Info: Model: Cat, Hours: 0
Machine #0 Info: Model: Cat, Hours: 0
Machine #0 Info: Model: Cat, Hours: 0

3 个答案:

答案 0 :(得分:0)

替换它:

num = num ++;

有了这个:

num = num + 1;

答案 1 :(得分:0)

好的,发现了两件事。首先是我应该使用“num ++”。对我来说很愚蠢。第二个是,因为我在初始化了所有类的实例后显示,我的 static int 将只显示该类初始化的总次数,而不是运行计数。

所以,如果我用这个替换类定义,结果就像预期的那样:

public class Machine
{
  public string model {get; set;}
  public int hours {get; set;}
  public static int totalnum = 0;
  public int num;

  public Machine() // constructor
  {
    model = "Cat";
    hours = 0;
    num = totalnum;
    totalnum ++; // count how many times class initialized
  }

  public void display() // display method
  {
    Console.WriteLine("Machine #{0} Info: Model: {1}, Hours: {2}",
    num, model, hours.ToString());
  }
}

抱歉这个愚蠢的错误。并且,我欢迎任何其他评论,如果这是一个“坏”方式来计算一个类在数组中初始化的次数。

答案 2 :(得分:0)

num = num++中,将增量前的值分配给num;

这基本上是幕后发生的事情:

首先评估num++以获得增量前的值。此值现在为0。

然后评估num++ num++ = num + 1,使其值为1;

最后进行赋值,但不是将{1}分配给num,而是将增量前的旧值赋给num;

这有点违反直觉。但如上所述,仅使用num = num++;num++;替换num = ++num;将解决您的问题。