为什么静态变量的值不会增加?

时间:2019-09-18 02:32:46

标签: c# variables static

为什么显示使用第一个帐户对象的静态变量的值不变? 我的意思是在下面的代码中,我创建了两个对象,该对象将为静态变量accountNumberSeed赋值,并且检查了如果我直接使用BankAccount.Number调用静态变量,但如果我调用使用第一个对象引用account.Number的值,即使我创建对象构造函数来增加它的值,static的值也不会增加。

class BankAccount
{
    public static int accountNumberSeed = 1234567890;
    public BankAccount(string name, decimal initialBalance)
    {
        this.Owner = name;
        this.Balance = initialBalance;
        //using constructor to assign value to static variable.
        this.Number = accountNumberSeed.ToString();
        accountNumberSeed++;
    }
}

这是另一个创建两个对象并使用第一个对象引用静态变量的类。

var account = new BankAccount("rian", 1000);
var account2 = new BankAccount("asda", 1000);
Console.WriteLine(account.Number);// this will show 1234567890
Console.WriteLine(BankAccount.Number);// this will show 1234567891

为什么值不同?我认为他们都应该显示1234567891?

3 个答案:

答案 0 :(得分:1)

您的问题询问为什么静态变量没有增加。但它正在增加。

“为什么值不同,我认为它们都显示1234567891”

这与您最初提出的问题矛盾。它们不能同时打印1234567891的原因是因为静态变量增加了两次:一次是在实例化第一个对象时,一次是在第二个对象实例化时。

仅当您认为输出应为1234567891和1234567892时,请注意,在这种情况下,问题是您正在分配给属性...

 this.Number = accountNumberSeed.ToString();

...在增加静态变量之前。

 accountNumberSeed++;

答案 1 :(得分:0)

之所以会发生这种情况,是因为static关键字使整个程序的变量accountNumberSeed成为一个变量,即,每次调用BankAccount时,它在内存中都保持不变。因此,当您第一次调用它时,它的值是1234567890,将其传递给Number,它是您首先打印的,然后增加到1234567891。第二次调用BankAccount时,相同的过程发生,首先从1234567890开始,通过,然后是1234567891,但是这次您打印的BankAccount.Number已经是1234567891。尝试做更多次,我相信您会得到相同的结果。

答案 2 :(得分:0)

其增量的原因是“类加载器在初始化类时仅加载一次静态字段(变量或方法)。静态字段完全不依赖于对象。为了详细理解,请在两个对象上设置一个断点创建并在静态变量上运行代码。

对于第一个对象创建,  “ public static int accountNumberSeed = 1234567890;” //将执行。

对于第二个对象创建,  “ public static int accountNumberSeed = 1234567890;” //不会执行。

有关您的信息:

=>它是一个属于类而不属于对象(实例)的变量

=>在执行开始时,静态变量仅初始化一次。这些变量将先初始化,然后再初始化任何实例变量

=>要由该类的所有实例共享的单个副本

=>可以通过类名称直接访问静态变量,并且不需要任何对象。

谢谢