2012-07-04 5 views
37

Я попытался создать public void Main() в C#; он говорит no static void Основной поиск.
Что именно означает для Main быть статическим? Я знаю, что код отлично работает для public static void Main().Почему основной должен быть статический?

Но почему Main должно быть static?

+0

Аналогичный вопрос был задан о java, и я думаю, что ответы также применимы и здесь: http://stackoverflow.com/questions/146576/why-is-the-java-main-matic-static – Tudor

+5

Неясно, спрашиваю, потому что вы не понимаете, что означает 'static' * вообще *, или это конкретно вокруг' Main'. –

ответ

46

Вам нужна точка входа в вашу программу. Static означает, что вы можете вызывать функцию без необходимости создания экземпляра объекта/экземпляра класса. Это немного «курица и яйцо» ... вы не можете создать объект перед тем, как попасть в программу.

Статический метод можно вызывать без создания экземпляра объекта. Поэтому main() должен быть статическим, чтобы он мог быть входом в вашу программу.

Как говорит Дэвид, вы можете просто добавить ключевое слово static в определение функции, чтобы изменить его. Стоит посмотреть на методы статического (класса) vs экземпляров, и знание разницы может быть полезно время от времени.

+25

«вы не можете создать объект перед тем, как оказаться в программе». Это явно ложно. Среда выполнения создает много объектов перед выполнением 'Main'. Вы можете инициировать это самостоятельно, поставив статический конструктор в класс, содержащий 'Main'. Извините, я понимаю, что эта тема> 1 год, но я считаю, что это актуально. –

+7

Ключевым моментом является то, что язык определен не для создания объекта, а затем вызывает Main. Он определяется как статическая функция. Это может работать по-другому, но нет. – usr

14

Только статический основной метод может выполнять эту работу, потому что существует соглашение, определяющее это поведение. Нет другой причины.

Посмотрите на C# language specification:

запуска приложений происходит, когда среда выполнения вызывает назначенный метод, который упоминается как приложения запись точки. Этот метод точки входа всегда называется Main, и должен иметь одно из следующих подписей:

 static void Main() {…} 
    static void Main(string[] args) {…} 
    static int Main() {…} 
    static int Main(string[] args) {…} 

Как показано, точка входа может дополнительно возвращать int значения. Это возвращаемое значение используется в заявке (п. 10.2).

Примечание: выше цитата из 4th edition, теперь называется "историческим". Текущая редакция написана по-разному.

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

+0

Зачем писать неправильный ответ ПОСЛЕ двух правильных ответов? –

+0

Пожалуйста, объясните, почему вы думаете, что это неправильно. –

+0

Правильный ответ в моих и ответах @ DavidM. Спецификация не дает причины, ПОЧЕМУ она просто говорит, что вам ДОЛЖНО делать. –

1

Понятно, что в рамке можно было бы указать, что вместо использования определенного статического метода для запуска программы он вместо этого построит экземпляр по умолчанию для определенного класса и выполнит на нем определенный метод. Если бы у кого-то была структура, в которой реализованы статические методы, если они были экземплярами экземпляра экземпляра singleton с инициализацией компилятора, такой подход может быть вполне разумным, так как инфраструктуре придется генерировать новый экземпляр объекта до вызова основной функции в любом случае ,

Если вызов статического метода «проще», чем создание экземпляра нового объекта и вызов метода на нем, тем не менее, нет никакой пользы для того, чтобы требовать, чтобы структура использовала более дорогой курс действий. Любой код, который хочет использовать последний подход был бы совершенно свободно использовать:

public static void Main([[params]]) 
{ 
    var mainObject = new MainObject(); 
    mainObject.Main([[params]]); 
} 

Там могут быть некоторые потенциальные выгоды с системой включают свой собственный статический метод, который выглядел что-то вроде:

public static void SysMain([[params]]) 
{ 
    using (Application app = new UserApp([[params]])) // UserApp derives from Application 
    { 
    app.Start(); // Virtual method 
    app.AllowNext(); // Base method--see text 
    app.Run(); // Abstract method 
    } 
} 

где app.AllowNext() был способом координировать работу с другими экземплярами приложений, запущенными, по существу, в одно и то же время, чтобы гарантировать, что повторные попытки запуска приложения в фоновом режиме будут обрабатывать их вызовы Start строго последовательно. Однако при отсутствии такой схемы координации очень мало пользы от необходимости требовать, чтобы структура создавала объект приложения перед его запуском. Стоимость не будет огромной, но без какой-либо потенциальной опознаваемой выгоды нет смысла принимать даже тривиальные затраты.

3

Есть два типа метода в классе:

  1. Non-статический метод
  2. статический метод

// Example of static and non-static methods and how to call 
namespace TestStaticVoidMain 
{ 
    class Program 
    { 
     Static Void Main(string[] args) 
     { 
      // Instantiate or create object of the non-static method: 
      Exam ob = new Exam(); 
      // Call the instance: 
      ob.Test1(); 

      // Directly the call the static method by its class: 
      Exam.Test2(); 

      Console.ReadKey(); 
     } 
    } 
    class Exam 
    { 
     public void Test1() 
     { 
      Console.WriteLine("This is a non-static method"); 
     } 

     public static void Test2() 
     { 
      Console.WriteLine("This is a static method"); 
     } 
    } 
} 

1. Статический метод:

Чтобы вызвать статический метод (функцию), нам не нужно создавать экземпляр или создавать объект этого метода. Мы не можем использовать ключевое слово new, потому что, когда класс загружается и компилируется, ключевое слово staticпо умолчанию создает или создает объект этого метода класса, поэтому мы напрямую вызываем статический метод.

Относительно static void Main(string[] args), мы уже обсуждали static. Остаток void Main(string[] args). void - тип данных, который ничего не возвращает. Main() - это стандартная точка входа в программу C#. Необязательный аргумент string[] args получает необязательные параметры «командной строки», с которыми была запущена программа.

2. Нестатические sethod:

Для вызова нестатического метода, мы должны создать экземпляр или создать объект метода класса для вызова метода (функция) класса, используя ключевое слово new.

Если класс с именем Test имеет метод нестатическая именем show(), то, как он будет называть экземпляр:

// to call non-static method 
Test ob=new Test(); 
ob.show(); 
-4

Статические члены контекстными на уровне класса (а не на уровне объекта) и поэтому может быть вызван без необходимости создания нового экземпляра класса. Основной метод является статическим, поскольку он доступен для запуска, когда запускается ваша программа, и поскольку она является точкой входа в программу, которую он запускает, не создавая экземпляр класса.

Другими словами, статические функции существуют до создания экземпляра класса, поэтому статическая применяется к основной точке входа (основной метод).

+4

Если вы собираетесь вставлять информацию с веб-сайтов, по крайней мере, указывать источник. http://www.codeproject.com/Articles/479467/Main-Method-in-Csharp –

1

Во время запуска приложения, когда объекты класса не были созданы, необходимо вызвать метод Main, чтобы начать выполнение программы. Главная иногда называется точкой входа приложения. Объявление Main as static позволяет среде выполнения вызывать Main без создания экземпляра класса. Метод Main, как правило, объявляется с заголовком:

static void Main(){..} 

, но также могут быть объявлены с заголовком:

static void Main(string[] args){..} 

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

Смежные вопросы