c#静态成员未在数组中添加

本文关键字:添加 数组 静态成员 | 更新日期: 2023-09-27 17:50:48

我正在学习c#,作为学习的一部分,我正在学习一些在线教程。有时候我喜欢稍微偏离一下教程,看看我是否能真正掌握所呈现的想法。

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

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

代码和结果在底部。

在学习静态成员时,我认为静态成员"在静态成员第一次被访问之前和在静态构造函数(如果有的话)被调用之前被初始化"(来自MSDN的静态类和静态类成员(c#编程指南))。如果是这样,这个布局不应该工作吗?谢谢大家的意见和建议。

代码:

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

c#静态成员未在数组中添加

替换此语句:

num = num ++;
与这个:

num = num + 1;

好了,发现了两件事。首先,我应该使用"num++"。我太蠢了。第二个原因是,由于我是在类的所有实例初始化之后才显示,所以我的静态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());
  }
}

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

num = num++中,递增前的值被赋给num;

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

首先计算num++,使其具有递增前的值。该值现在为0。

则计算num++,因此num++ = num + 1的值为1;

最后进行赋值操作,但是没有将1赋值给num,而是将增量前的旧值赋值给num;

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