Действительно ли точка с запятой нужна после объявлений в x ++?

Как сказано в книге Программирование на Microsoft Dynamics AX 2009: начало работы, нужно положить точки с запятой после объявлений в x ++:

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

(скопирован непосредственно из книги, без изменений, при необходимости я удалю его)

Однако, когда я удаляю точку с запятой и запускаю задание, нет абсолютно никакой ошибки или проблемы:

static void Job1(Args _args)
{
    str string1 = "STACKOVERFLOW";
    ;
    print string1;
    pause;
}

работает так же, как

static void Job2(Args _args)
{
     str string1 = "STACKOVERFLOW";

     print string1;
     pause;
}

Действительно ли это необходимо? Должен ли я привыкнуть к его использованию?

Ответ 1

Это объяснилось довольно элегантно здесь.

Ключевая цитата:

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

Ответ 3

Вам нужна только точка с запятой, если тело вашего кода не начинается с ключевого слова. В вашем примере ваш код начинается с print, который является встроенным ключевым словом. Если вы попытались запустить код: string1+=".COM";, вы получите сообщение об ошибке.

Dynamics AX 2009 - последняя версия AX, для которой требуется дополнительная точка с запятой. AX 6.0 должен исправить это: mfp два цента: что с этой точкой с запятой?

Ответ 4

Вам действительно не нужна прекрасная точка с запятой (вы не получаете ошибку компиляции), когда следующее слово после объявлений (если есть) не является ключевым словом, распознанным компилятором как тип ( EDT, таблица, класс,...)

Например:

void method1()
{
    CustTable    custTable;

    custTable = CustTable::find("cust");
}

ERROR!, поскольку компилятор не может отделить блок объявления класса от начала кода X ++. Когда компилятор читает вторую строку, он не знает, является ли custTable новой переменной или является частью кода X ++. Таким образом, вам нужна дополнительная точка с запятой, чтобы сказать компилятор, где заканчивается объявление (на самом деле, где начинается код X ++).

void method1()
{
    CustTable    custTable;

    if (custTable)
    {
        // stuff happens
    }        
}

WORKS!, поскольку компилятор знает, что вы не можете объявить переменную типа if (это зарезервированное ключевое слово, очевидно), поэтому ясно, что это начало кода X ++, и вы можете 't объявлять переменные после этой строки.

Это работает так, даже если нет объявлений переменных:

CustTable method1()
{
    custTable = CustTable::find("cust"); // custTable may exists in the context
    return custTable;
}

ОШИБКА! custTable может быть декомпозицией или кодом X ++, подобным этому примеру.

CustTable method1()
{
    return CustTable::find("cust");
}

РАБОТЫ!, поскольку return не может быть объявлением.

EXTRA

void method1()
{
    info("This should work, ya?");
}

Это должно работать (поскольку info не является типом), не так ли?... но это не так! Зачем? Поскольку info - это специальный метод ядра, который будет заменен на его полное имя: Global::info(), первый токен будет Global после замены прекомпилятора, а Global - класс.