我正在学习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
答案 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;
将解决您的问题。