思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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()方法及其所在的类的问题占整个系统问题的比重极低极低,它只做为一个入口存在,真正费思量的地方,还是在其它核心类上。