2011-09-24 58 views
2

正在學習C#並寫了一段簡單的代碼,但我不明白爲什麼我必須在Main方法的範圍內聲明變量userChoice和numberR,而不是在該範圍內。如果我喜歡這個類中聲明它,我得到生成錯誤對象的引用是必需的嗎?

using System; 

namespace FirstProgram 
{ 
class Program 
{ 
    string userChoice; 
    int numbeR; 

static void Main() 
    { 
     Console.WriteLine("Write a number..."); 
     userChoice = Console.ReadLine(); 

     numbeR = Convert.ToInt32(userChoice); 
     Console.WriteLine("You wrote {0}", numbeR); 
     Console.ReadLine(); 
    } 
} 
} 

但只有這會讓我沒有任何錯誤:

using System; 

namespace FirstProgram 
{ 
class Program 
{  
static void Main() 
    { 
     string userChoice; 
     int numbeR; 

     Console.WriteLine("Write a number..."); 
     userChoice = Console.ReadLine(); 

     numbeR = Convert.ToInt32(userChoice); 
     Console.WriteLine("You wrote {0}", numbeR); 
     Console.ReadLine(); 
    } 
} 
} 

我不應該能中主要使用這兩個變量只需在上面的類中聲明它們呢?我很困惑......感謝您的任何建議。

回答

5

你不能這樣做,因爲Main()是一個靜態函數。您的變量被聲明爲實例變量,只能在Program類的實例上訪問。如果您將userChoicenumbeR聲明爲靜態變量,則會進行編譯。

static string userChoice; 
static int numbeR; 

static void Main() 
{ 
    //your code 
} 

靜態成員意味着你可以使用成員不實例化類。試想一下:

public class MyClass 
{ 
    public static int StaticInt; 
    public int NonStaticInt; 
} 

意味着你可以這樣做:

MyClass.StaticInt = 12; // legal 
MyClass.NonStaticInt = 12; // error, can't staticly access instance member 

和所有類都可以訪問這種變化,因爲只有一個MyClass.StaticInt在你的程序。要改變NonStaticInt,你必須創建一個類的實例,比如:

MyClass mine = new MyClass(); 
mine.NonStaticInt = 12; // legal 
mine.StaticInt = 12; // Error, cannot access static member on instance class. 
+0

感謝非常詳細的回答與闡述,幫助我更深入地理解。 –

2

你必須做,因爲你的主要方法,你的變量靜態是靜態的。

+0

正確答案! – wonde

1

由於Main靜態,您的變量也需要是靜態的才能像這樣使用。如果你聲明他們爲:

static string userChoice; 
static int numbeR; 

然後它會工作。

您目前有他們一個實例Program對象內部聲明。但是,靜態方法(如Main)是類型的一部分,而不是特定的實例。

1

因爲Mainstatic

如果你聲明變量(又稱爲字段)爲靜態的,那麼也可以在類

靜態字符串userChoice聲明它們; static int numbeR;

static方法和變量被稱爲實例方法和變量。實例變量與特定對象相關,而變量則在類中所有創建的對象之間共享。

規則是,static方法只能調用靜態方法並訪問static變量,但實例方法可以調用static和非靜態變量和方法。

1

原因是因爲Main()是一個靜態方法,兩個類字段(userChoice和numbeR)是實例字段。

可以靜態調用Main(),但直到創建了一個Program類的實例後纔會定義這兩個類字段。

1

Main()方法聲明爲static。但是,在您的第一個代碼示例中,將兩個變量(userChoice & number)聲明爲實例變量。靜態Main()方法不屬於特定對象,而是屬於某種類型。但是,您的變量確實屬於程序類型的特定實例。您不能在靜態方法中使用實例變量。

0

問題是Main是靜態的。您將不得不聲明變量userChoice和numbeR爲靜態。然後它會編譯。這裏是修正的例子:

using System; 

namespace FirstProgram 
{ 
    class Program 
    { 
     static string userChoice; 
     static int numbeR; 

     static void Main() 
     { 
      Console.WriteLine("Write a number..."); 
      userChoice = Console.ReadLine(); 

      numbeR = Convert.ToInt32(userChoice); 
      Console.WriteLine("You wrote {0}", numbeR); 
      Console.ReadLine(); 
     } 
    } 
} 
相關問題