为什么显示使用第一个帐户对象的静态变量的值不变?
我的意思是在下面的代码中,我创建了两个对象,该对象将为静态变量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?
答案 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;” //不会执行。
有关您的信息:
=>它是一个属于类而不属于对象(实例)的变量
=>在执行开始时,静态变量仅初始化一次。这些变量将先初始化,然后再初始化任何实例变量
=>要由该类的所有实例共享的单个副本
=>可以通过类名称直接访问静态变量,并且不需要任何对象。
谢谢