我正在学习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();
}
}
}
我不应该在Main中使用这两个变量,只需在上面的类中声明它们吗?我很困惑...感谢任何建议。
答案 0 :(得分:5)
你无法做到,因为Main()
是一个静态函数。您的变量被声明为实例变量,只能在Program
类的实例上访问。如果将userChoice
和numbeR
声明为静态变量,则会编译。
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.
答案 1 :(得分:2)
由于Main方法是静态的,因此必须使变量保持静态。
答案 2 :(得分:1)
由于Main
是 static ,您的变量也需要是静态的才能像这样使用。如果您将它们声明为:
static string userChoice;
static int numbeR;
然后它会起作用。
您当前在Program
对象的实例中声明了它们。但是,静态方法(例如Main
)是类型的一部分,而不是特定的实例。
答案 3 :(得分:1)
因为Main
是static
如果你将变量(a.k.a. fields)声明为static也可以在类中声明它们
静态字符串userChoice; static int numbeR;
非static
方法和变量称为实例方法和变量。实例变量与特定对象相关,而static
变量在类中所有创建的对象之间共享。
规则是static
方法只能调用静态方法并访问static
变量,但实例方法可以同时调用static
和非静态变量和方法。
答案 4 :(得分:1)
原因是因为Main()是一个静态方法,两个类字段(userChoice和numbeR)是实例字段。
可以静态调用Main(),但在创建Program类的实例之前,不会定义两个类字段。
答案 5 :(得分:1)
Main()方法声明为static。但是,在第一个代码示例中,您将两个变量(userChoice& number)声明为实例变量。静态Main()方法不属于特定对象,而属于某种类型。但是,您的变量确实属于Program类型的特定实例。您不能在静态方法中使用实例变量。
答案 6 :(得分:0)
问题是Main是静态的。您必须将变量userChoice和numbeR声明为static。然后它会编译。以下是更正后的示例:
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();
}
}
}