虽然我可以感知,这是莫名其妙,你的东西是在声明它的代码的顺序。有一个在下面的代码看看:
class Program
{
public Program()
{
}
public void myFunc()
{
canIAccessIt = 10;
}
public int canIAccessIt = 0;
}
以上,在C语言背景(忽略其不存在C类部分)上面的代码中任何人都可能进入一个以为myFunc
函数试图访问一个变量canIAccessIt
甚至在它被宣布或进入范围之前。
C#.Net世界中的变量范围并不是那种方式。一个类级变量(又名成员变量)与对象的实例相关联,并且从创建对象到时间对象被销毁或垃圾收集时进入范围。
就像在上面的情况一样,人们可能会认为canIAccessIt
变量可能没有成为现实,因为它在myFunc
方法下被声明。这是所以不是。
当我上面的代码是由C#编译器编译它成为你的* .dll文件里面写MSIL(Microsoft中间语言)这样的事情这是C#项目建设过程中的输出:
class Program
{
public int canIAccessIt;
public Program()
{
canIAccessIt = 0;
}
public void myFunc()
{
canIAccessIt = 10;
}
}
注意:上述MSIL代码仅供参考,以便您能理解它。 MSIL代码看起来比这更奇怪,因为它必须由CLR而不是用户或程序员来理解。
因此,对于编译器来说,全局变量在类中声明的位置并不重要。只要它在你的类的开头({
)和关闭大括号(}
)的内部,那么它的初始化将移到你的类的构造函数中。一个类的构造函数是每当你创建一个类实例时被调用的第一个方法。它发生的那一刻你的变量就会变成现实(被初始化和初始化),并成为在范围内被myFunc
方法所使用。
在你的类中,唯一与i
变量不同的是它是静态的,所以它的初始化将移动你的类的静态构造函数,而不是你类的实例构造函数。您的i
变量的生命周期和范围与您的类的Type
实例(又名静态实例)相关联。
所以每当你初始化类第一时间能在这里打电话给你ReplaceCC
方法是事件的顺序:
- 实例构造函数被调用。
- 静态构造函数被调用 - 它初始化您的静态变量
i
。
- 然后你在对象实例上调用
ReplaceCC
方法,当我已经实例化和初始化。
你也可以看看this回答哪个秒我的想法。
来源
2017-05-03 21:01:33
RBT
对于试图了解您的问题而言,这是非常草率的,请修改问题并发布与您遇到的问题相关的所有相关代码,此外,请编辑解释并将其作为真正的问题在哪里调用'ReplaceCC()'? – MethodMan
变量是静态的。这意味着它是在使用之前创建的。 https://msdn.microsoft.com/en-us/library/79b3xss3.aspx – Steve
@Steve即使它是一个实例变量,代码也会编译得很好(尽管它的行为会有所不同)。 – Servy