为什么我可以从“method()”而不是Main()方法访问X变量?
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?
}
}
答案 0 :(得分:13)
尝试
static int X
X
是一个实例变量,这意味着您的类的每个实例都有自己的X
版本。但是,Main是一个静态方法,这意味着Program
类的所有实例只有一个Main,因此访问X
没有意义,因为可能有多个X如果没有创建Program
实例,则可能根本没有。
使X本身静态,意味着所有Program
个实例将共享X
,因此共享方法将能够访问它。
答案 1 :(得分:5)
Main()是一个静态函数。无法从静态函数访问非静态变量。
答案 2 :(得分:4)
假装你有一个包含两个变量的Person类:
眼睛的数量属于类(静态),而眼睛的颜色属于每个实例。
如果你将眼睛的数量从2改为3,那么世界上每个人都会立即拥有3只眼睛,因为所有实例都拥有相同的静态变量。
如果您将某个人的实例的眼睛颜色从蓝色更改为红色,那么只有该个人会有红眼。
如果您能够访问静态方法内的非静态成员,它将需要什么值?由于没有明智的答案,所以不允许发生。
答案 3 :(得分:3)
X
和metodo()
都在实例级别。 Main()
处于静态级别。如果您希望X
和Main()
同时使用metodo
,则需要将其声明为静态(即private static int X
)。
答案 4 :(得分:2)
X
是一个实例变量,但Main
是一个静态方法,即它与class Program
的任何特定实例都没有关联。
答案 5 :(得分:0)
要访问X,您需要使用static关键字标记它或创建Program类的实例:
1
static int X
2
static void Main(string[] args)
{
int a;
var program = new Program();
a = program.X;
}
您应该阅读关于班级成员和班级实例成员的更多信息。