2010-07-21 38 views
4

爲什麼我可以從「method()」而不是從Main()方法訪問X變量?Main()不想訪問類變量

class Program 
    { 
     int X; // this is the variable I want access 

     static void Main(string[] args) 
     { 
      int a; 
      a = X; // this doesnt work, but why? 
     } 
     void metodo() 
     { 
      int b; 
      b = X; //this works, but why? 
     } 
    } 

回答

12

嘗試

static int X 

X是一個實例變量,這意味着你的類的每一個實例都會有自己的X版本。然而,Main是一個靜態方法,這意味着對於Program類的所有實例只有一個Main,所以它訪問X是沒有意義的,因爲可能有多個X或根本沒有,如果沒有創建Program實例。

使X本身爲靜態,意味着所有Program實例將共享X,因此共享方法將能夠訪問它。

5

Main()是一個靜態函數。非靜態變量不能從靜態函數訪問。

1

X是一個實例變量,但Main是一種靜態方法,即它不與任何特定的class Program實例相關聯。

3

Xmetodo()都在實例級別。 Main()處於靜態級別。如果要X可用於Main()metodo,則需要將其聲明爲靜態(即private static int X)。

0

要訪問你需要或者X採用靜態關鍵字標記,或創建程序類的實例:

1.

static int X 

2.

static void Main(string[] args) 
     { 
      int a; 
      var program = new Program(); 
      a = program.X; 
     } 

你應該多看課堂上的成員以及課堂實例的成員。

4

假裝你有兩個變量Person類:

  • 眼睛的顏色
  • 數量眼睛

眼數屬於類(靜態),而眼睛的顏色所屬的到每個實例。

如果您將眼睛數量從2更改爲3,那麼世界上的每個人都會立即擁有3隻眼睛,因爲所有實例共享相同的靜態變量。

如果您將某個人的實例的眼睛顏色從藍色更改爲紅色,那麼只有該個人會有紅眼睛。

如果你能夠訪問一個靜態方法內的非靜態成員,它會需要什麼值?既然沒有理智的答案,那就不允許發生。