Ссылка на объект обязательна? - PullRequest
2 голосов
/ 24 сентября 2011

Я изучаю C # и написал простой код, но я не понимаю, почему я должен объявлять переменные userChoice и numberR в рамках метода Main, а не в пределах класса. Если я объявлю это в классе, как это, я получу ошибки сборки

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, просто объявив их в классе, как указано выше? Я в замешательстве ... спасибо за любой совет.

Ответы [ 7 ]

5 голосов
/ 24 сентября 2011

Вы не можете сделать это, потому что 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.
2 голосов
/ 24 сентября 2011

Вы должны сделать ваши переменные статическими, так как ваш метод Main является статическим.

1 голос
/ 24 сентября 2011

Метод Main () объявлен как static . Однако в первом примере кода вы объявляете две переменные (userChoice & number) в качестве переменных экземпляра. Статический метод Main () относится не к конкретному объекту, а к определенному типу. Однако ваши переменные принадлежат конкретному экземпляру типа Программы. Вы не можете использовать переменные экземпляра в статическом методе.

1 голос
/ 24 сентября 2011

Причина в том, что Main () является статическим методом, а два поля класса (userChoice и numbeR) являются полями экземпляра.

Main () можно вызывать статически, но два поля класса не будутопределяться до тех пор, пока не будет создан экземпляр класса Program.

1 голос
/ 24 сентября 2011

, поскольку Main равно static

, если вы объявите переменные (также называемые полями) как статические, вы можете объявить их в классе

static string userChoice;static int numbeR;

Не static методы и переменные называются instance методы и переменные.Переменные экземпляра относятся к определенному объекту, в то время как static переменные являются общими для всех созданных объектов в классе.

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

1 голос
/ 24 сентября 2011

Поскольку Main является статическим , ваши переменные также должны быть статическими, чтобы их можно было использовать таким образом.Если вы объявите их как:

static string userChoice;
static int numbeR;

, тогда это будет работать.

В настоящее время они объявлены внутри экземпляра объекта Program.Однако статические методы (такие как Main) являются частью типа, а не конкретным экземпляром.

0 голосов
/ 24 сентября 2011

Проблема в том, что 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...