Действительно ли точка с запятой нужна после объявлений в 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
Это объяснилось довольно элегантно здесь.
Ключевая цитата:
"Причина, по которой вам нужна эта дополнительная точка с запятой, заключается в том, что компилятор не может видеть, где заканчиваются объявления переменных. помогите немного, это сделает предположение. И это не очень хорошо угадывание".
Ответ 2
С выпуском AX 2012 нет необходимости помещать дополнительную точку с запятой после объявления переменной.
http://msdn.microsoft.com/en-us/library/aa636895.aspx
Ответ 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
- класс.