namespace TestProjectG
{
class Program
{
int i = 0;
static void Main(string[] args)
{
Console.WriteLine(i);
}
}
}
上面這段代碼是有問題的,就是因為,如果下意識的把Main方法當作類Program(當然其它名字也一樣,不過預設產生的是這個)的一個成員方法的話,那麼就會想當然的認為類的方法在類內部使用類的成員變數,即使這個是私人的成員變數,也不會有問題吧?事實上不是,Main方法其實不能考慮為它所在類的成員方法,如果在Main中要使用任何成員變數,要麼是在Main方法自己內部聲明的局部變數,要麼是來自於其它類的變數,必須使用合適的引用方法。
就是說Main方法與它所在的類沒有任何關係,它只是被安排放在某個類中,你完全把它放在任意的其它類中,不影響任何使用效果。
---有人幫我評論了我才意識到,Main() 方法確實是一個靜態方法 ,當然就不能使用類的非靜態成員變數了,非常感謝評論的二位~
另外我前面的想法是完全錯誤的,一旦一個Main()方法被加入到某個類中,它就確實成為這個類的一部分了,證據如下:
1 namespace TestProjectG
2 {
3 class Program
4 {
5 private static int i = 0;
6 public static void Main(string[] args)
7 {
8 Console.WriteLine(i);
9 }
10 }
11 }
Main()方法可以訪問該類中的靜態私人欄位,在IL中是這樣子的:
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldsfld int32 TestProjectG.Program::i
IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
IL_000b: nop
IL_000c: ret
} // end of method Program::Main
因此,Main()方法跟它所在的類是有關係的。事實上,在實際的軟體系統中,涉及到Main()方法及其所在的類的問題占整個系統問題的比重極低極低,它只做為一個入口存在,真正費思量的地方,還是在其它核心類上。