2009-12-29 10 views
10

Jak powiedział w książce Microsoft Dynamics AX 2009 Programowanie: Rozpoczęcie its potrzebnych do wprowadzenia średników po deklaracji w X ++:Czy po deklaracjach w języku x ++ potrzebny jest średnik?

Dodatkowy średnik po zmiennej zgłoszenie jest obowiązkowe, o ile w pierwsza linia kodu nie jest słowem kluczowym . Średnik mówi kompilatorowi , że zakończyły się deklaracje zmiennych . Nie można zadeklarować nowych zmiennych po tym średniku .

(kopiowane bezpośrednio z książki, bez zmian, jeśli to konieczne i'll usunąć go)

Jednak, kiedy usunąć średnik i wykonać zadanie, there's absolutnie żadnego błędu lub problemu:

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

działa tak samo

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

    print string1; 
    pause; 
} 

Czy to naprawdę konieczne? czy powinienem się przyzwyczaić do jej używania?

+0

Już miałem zadać to samo pytanie, gdy natknąłem się na http://msdn.microsoft.com/en-us/library/cc967415.aspx. Dobre pytanie! –

+0

, aby uzyskać więcej informacji: http://blogs.msdn.com/b/mfp/archive/2008/04/24/what-s-up-with-this-semicolon.aspx –

+0

Twoja odpowiedź jest właśnie w definicji. "obowiązkowe, o ile pierwszy wiersz kodu nie jest słowem kluczowym." "print" jest słowem kluczowym. – SShaheen

Odpowiedz

13

Wyjaśniono to raczej elegancko here.

Kluczowym cytat:

„Powodem trzeba, że ​​dodatkowy średnik jest fakt, że kompilator nie zawsze można zobaczyć, gdzie zmienna koniec deklaracje Jeśli nie pomóc trochę, to będzie. zgadnij, a to nie jest dobre w zgadywaniu. "

+2

Widziałam, że nie jesteś naprawdę w x ++ i dynamika (w oparciu o twoje pytania i odpowiedzi), czy po prostu to szukałeś? dobrze znalezione! – Marcelo

5

Potrzebny jest tylko średnik, jeśli treść kodu nie zaczyna się od słowa kluczowego. W twoim przykładzie twój kod zaczyna się od print, który jest wbudowanym słowem kluczowym. Jeśli próbowałeś zacząć kod z: string1+=".COM";, otrzymasz błąd.

Dynamics AX 2009 to ostatnia wersja AX, która będzie wymagać dodatkowego średnika. AX 6.0 powinien to naprawić: mfp's two cents: What's up with this semicolon?

6

Wraz z wydaniem AX 2012 nie ma potrzeby wstawiania dodatkowego średnika po deklaracji zmiennej.

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

+4

Ściśle mówiąc, nie jest to prawdą: http://msdn.microsoft.com/en-us/library/cc641200.aspx "Zaczynając od Microsoft Dynamics AX 2012, rzadko musisz podawać średnik przed pierwszym stwierdzeniem w swoim Metody X ++.Jednakże potrzebujesz średnika w metodach X ++, które wywołują metody statyczne w .NET Framework. " Więcej informacji: http://erptechnician.net/2012/06/30/method-not-found-error-xpp-call-static-method-dotnet-class/ To jest przypadek, jednak rzadko może być, gdy średnik jest wymagany nawet w AX 2012. – 10p

4

Naprawdę nie trzeba się piękny średnik (nie pojawia się błąd kompilacji), gdy następne słowo po deklaracji (jeśli w ogóle) nie jest uznawany przez niektórych słów kluczowych, takich jak kompilator typ (y EDT, stół, klasa, ...)

Na przykład:

void method1() 
{ 
    CustTable custTable; 

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

BŁĄD! jako kompilator nie może oddzielić bloku deklaracji klasy od początku kodu X ++. Gdy kompilator czyta drugą linię, nie wie, czy custTable jest nową zmienną, czy też jest częścią kodu X ++.Tak więc, potrzebujesz dodatkowego średnika, aby powiedzieć kompilatorowi, gdzie jest koniec deklaracji (naprawdę, gdzie jest początek kodu X ++).

void method1() 
{ 
    CustTable custTable; 

    if (custTable) 
    { 
     // stuff happens 
    }   
} 

DZIAŁA! jako kompilator wie, że nie można zadeklarować zmiennej typu if (jest to oczywiście zastrzeżone słowo), więc jasne jest, że jest to początek kodu X ++ i nie można zadeklarować zmiennych po tym wierszu.

Działa to w ten sposób, nawet jeśli nie ma deklaracji zmiennych:

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

Błąd!custTable może być dekaracją lub kodem X ++ podobnym do tego przykładu.

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

DZIAŁA! jako return nie może być deklaracją.

EXTRA:

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

ten powinien działać (jako info nie jest typem), prawda? ... ale tak nie jest! Czemu? Ponieważ info jest specjalną metodą jądra, która zostanie zastąpiona pełną nazwą: Global::info(), pierwszy token będzie Global po wymianie prekompilatora, a Global jest klasą.