Main () не хочет обращаться к переменной класса - PullRequest
4 голосов
/ 22 июля 2010

Почему я могу получить доступ к переменной X из "method ()", а не из метода Main ()?

    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?
        }
    }

Ответы [ 6 ]

13 голосов
/ 22 июля 2010

Try

static int X

X - это переменная экземпляра, что означает, что каждый экземпляр вашего класса будет иметь свою собственную версию X.Однако Main - это статический метод, который означает, что существует только один Main для всех экземпляров класса Program, поэтому для него нет смысла обращаться к X, так как может быть несколько X или может бытьвообще ничего, если экземпляры Program не созданы.

Если сделать сам X статичным, это означает, что все экземпляры Program будут совместно использовать X, поэтому общий метод сможет получить к нему доступ.

5 голосов
/ 22 июля 2010

Main () является статической функцией. Нестатические переменные не доступны из статических функций.

4 голосов
/ 22 июля 2010

Представьте, что у вас есть класс Person с двумя переменными:

  • цвет глаз
  • количество глаз

Количество глаз принадлежит классу (статический), в то время как цвет глаз принадлежит каждому экземпляру.

Если вы измените число глаз с 2 на 3, то у каждого человека в мире сразу будет 3 глаза, потому что все экземпляры имеют одну и ту же статическую переменную.

Если вы измените цвет глаз экземпляра человека с синего на красный, тогда только этот человек будет иметь красные глаза.

Если бы вы могли получить доступ к нестатическим элементам внутри статического метода, какое значение это имело бы? Поскольку нет вменяемого ответа на это, это не может произойти.

3 голосов
/ 22 июля 2010

Оба X и metodo() находятся на уровне экземпляра. Main() на статическом уровне. Если вы хотите, чтобы X был доступен для Main() и metodo, вам нужно объявить его как статический (т. Е. private static int X).

2 голосов
/ 22 июля 2010

X - переменная экземпляра, но Main - статический метод, то есть он не связан ни с одним конкретным экземпляром class Program.

0 голосов
/ 22 июля 2010

Чтобы получить доступ к X, вам нужно либо пометить его статическим ключевым словом, либо создать экземпляр класса Program:

1.

static int X

2.

static void Main(string[] args)
        {
            int a;
            var program = new Program();
            a = program.X; 
        }

Вы должны прочитать больше об участниках класса и об экземплярах класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...