在x ++声明后真的需要分号吗?

时间:2009-12-29 18:23:35

标签: declaration axapta 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;
}

真的需要吗?我应该习惯使用它吗?

4 个答案:

答案 0 :(得分:14)

它的解释相当优雅here

关键引用[强调我的]:

  

“你需要额外分号的原因是因为编译器不能总是看到变量声明结束的位置。如果你没有帮助,它会做出猜测而且猜测不太好。“

     

当编译器正在分析代码时,检查行上的第一个单词是否与类型名称(AOT对象)匹配。如果它是类型名称,则编译器将该行视为变量声明。在这种情况下,变量名称应该是下一个。

答案 1 :(得分:8)

随着AX 2012的发布,在变量声明之后无需添加额外的分号。

http://msdn.microsoft.com/en-us/library/aa636895.aspx

答案 2 :(得分:6)

如果代码正文不以关键字开头,则只需要分号。在您的示例中,代码以print开头,string1+=".COM";是内置关键字。如果您曾尝试使用以下代码启动代码:{{1}},则会收到错误。

Dynamics AX 2009是AX的最后一个版本,需要额外的分号。 AX 6.0应解决此问题:mfp's two cents: What's up with this semicolon?

答案 3 :(得分:4)

当声明(如果有)之后的 下一个单词 不是某个关键字时,你真的不需要可爱的分号(你没有得到编译错误)由编译器识别的类型(EDT,表格,类,......)

例如:

void method1()
{
    CustTable    custTable;

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

错误!因为编译器无法分离X ++代码开头的类声明块。当编译器读取第二行时,它不知道custTable是新变量还是X ++代码的一部分。所以,你需要额外的分号来说明编译器在哪里是声明的结尾(实际上,X ++代码的起点在哪里)。

void method1()
{
    CustTable    custTable;

    if (custTable)
    {
        // stuff happens
    }        
}

WORKS!因为编译器知道你不能声明类型为if的变量(显然它是一个保留关键字)所以很明显这是X ++代码的开头和你不能在这一行之后声明变量。

即使没有变量声明,这也是这样的:

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

错误! custTable可能是一个decaration,或者像这个例子的X ++代码。

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

WORKS!,因为return不能作为声明。

<强> EXTRA:

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

这应该有效(因为info不是一种类型),不是吗? ......但它没有!为什么?因为info是一个特殊的内核方法,将被替换为其全名:Global::info(),在预编译器替换后,第一个标记将为Global,而Global是一个类。