Заявления только в методах, но как насчет объявлений?

На MSDN я нашел:

В C # каждая выполняемая инструкция выполняется в контексте метода.

Но я также читал, чтоint A=5; утверждение может быть в теле класса. Кажется, что это не в теле метода, так почему это возможно? Это, вероятно, просто термин путаница, но я хотел бы знать.

 Bernard05 окт. 2010 г., 19:16
Я запутался в том, что ты спрашиваешь.

Ответы на вопрос(3)

Адриан прав. Для уточнения: «int A = 5;» это только утверждение, когда оно находится внутри тела метода. Если он находится вне тела метода, то это объявление поля с инициализатором, который логически перемещается в тело конструктора.

Точная семантика того, как работают инициализаторы, немного хитрая. Для некоторых мыслей об этом см .:

http://blogs.msdn.com/b/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx

Вы, вероятно, имеете в виду инициализацию полей:

class Foo
{
    private static int i = 5;
}

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

Решение Вопроса
class Example
{
    int A = 5;
}

равно

class Example
{
    int A;

    public Example()
    { 
        A = 5;
    }
}

Таким образом, присвоение все еще является частью метода (конструктора).

 Marc Gravell05 окт. 2010 г., 19:21
На самом деле это не совсем верное представление; инициализаторы поля iirc вызываютсядо базовый вызов ctor. C # не может выразить, что хотя быпосле базовый вызов ctor.
 Michael05 окт. 2010 г., 19:17
Это может быть доказано, кстатитолько для чтения помеченные поля могут быть назначены в определении класса ИЛИ в конструкторе (только).
 Marc Gravell05 окт. 2010 г., 19:19
@ Майкл - этоопоры это, но это не доказательство. Доказательство простое: именно так позволяет языковая спецификация.
 Michael06 окт. 2010 г., 00:15
Он ссылался на приведенный выше пример равенства - и ни в коем случае не пытался определить саму спецификацию или IL, сгенерированный из двух приведенных выше примеров. Вы пытаетесь прочитать больше в моем заявлении ....?

Ваш ответ на вопрос