需要对象引用
本文关键字:对象引用 | 更新日期: 2023-09-27 18:09:47
我正在学习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中使用这两个变量,就像上面那样在类中声明它们吗?我很困惑……谢谢你的建议。
您不能这样做,因为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.
由于Main方法是静态的,所以必须将变量设置为静态
由于Main
是静态,因此您的变量也需要是静态的,以便这样使用。如果您将它们声明为:
static string userChoice;
static int numbeR;
那么它将工作。
您目前在Program
对象的实例中声明了它们。但是,静态方法(如Main
)是类型的一部分,而不是特定的实例。
因为Main
是static
如果您将变量(也称为字段)声明为静态,则可以在类
中声明它们。静态字符串userChoice;static int numbeR;
非static
方法和变量称为instance方法和变量。实例变量与特定对象相关,而static
变量在类中所有创建的对象之间共享。
规则是static
方法只能调用静态方法和访问static
变量,但是实例方法可以调用static
和非静态变量和方法
原因是Main()是一个静态方法,两个类字段(userChoice和numbeR)是实例字段。
Main()可以静态调用,但是直到创建了Program类的实例之后,才会定义这两个类字段。
Main()方法被声明为静态的。然而,在第一个代码示例中,您声明了两个变量(userChoice &编号)作为实例变量。静态Main()方法不属于特定对象,而是属于特定类型。但是,您的变量确实属于Program类型的特定实例。不能在静态方法中使用实例变量
问题是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();
}
}
}