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
替换此语句:
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++;
将解决您的问题。