2011-09-24 52 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(); 
     } 
    } 
} 
相关问题