2009-12-29 14 views
10

Como se ha dicho en el libro Microsoft Dynamics AX 2009 Programación: Introducción Está necesarios para poner punto y coma después de las declaraciones de x ++:¿Es realmente necesario el punto y coma después de las declaraciones en x ++?

El punto y coma adicional después de la declaración de variables es obligatorio, siempre y cuando el La primera línea de código no es una palabra clave . El punto y coma le dice al compilador que las declaraciones variables han llegado a su fin. No puede declarar nuevas variables después de este punto y coma.

(copiado directamente del libro, sin cambios, si es necesario voy eliminarlo)

Sin embargo, cuando me quito el punto y coma y ejecutar el trabajo, HAY absolutamente ningún error o problema:

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

funciona igual de

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

    print string1; 
    pause; 
} 

¿es realmente necesario? ¿debería acostumbrarme a usarlo?

+0

Estaba a punto de hacer la misma pregunta cuando me encontré con http://msdn.microsoft.com/en-us/library/cc967415.aspx. ¡Buena pregunta! –

+0

para obtener más información: http://blogs.msdn.com/b/mfp/archive/2008/04/24/what-s-up-with-this-semicolon.aspx –

+0

Su respuesta está ahí en la definición. "obligatorio siempre que la primera línea de código no sea una palabra clave". 'print' es una palabra clave. – SShaheen

Respuesta

13

Se explica bastante elegante here.

Una cita clave:

"La razón es necesario que coma adicional se debe a que el compilador no siempre se puede ver dónde está el final declaraciones variables Si no lo hace ayuda un poco, lo hará. adivine. Y no es muy bueno en adivinando ".

+2

He visto que no estás realmente interesado en x ++ y la dinámica (en función de tus preguntas y respuestas) ¿acabas de buscarla? bien encontrado! – Marcelo

5

Sólo es necesario el punto y coma si el cuerpo de su código no comienza con una palabra clave. En su ejemplo, su código comienza con print, que es una palabra clave incorporada. Si hubiera intentado iniciar su código con: string1+=".COM";, recibiría un mensaje de error.

Dynamics AX 2009 es la última versión de AX que requerirá el punto y coma adicional. AX 6.0 debería corregir esto: mfp's two cents: What's up with this semicolon?

6

Con el lanzamiento de AX 2012 no hay necesidad de poner el punto y coma adicional después de la declaración de la variable.

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

+4

Estrictamente hablando, esto no es cierto: http://msdn.microsoft.com/en-us/library/cc641200.aspx "Comenzando en Microsoft Dynamics AX 2012, rara vez necesita incluir un punto y coma antes de la primera instrucción en su Métodos X ++. Sin embargo, necesita el punto y coma en los métodos X ++ que llaman a métodos estáticos en .NET Framework. " Más sobre esto aquí: http://erptechnician.net/2012/06/30/method-not-found-error-xpp-call-static-method-dotnet-class/ Eso es que hay casos, sin embargo, rara vez podría ser, cuando se requiere el punto y coma incluso en AX 2012. – 10p

4

Usted realmente no necesita el precioso punto y coma (no obtiene un error de compilación) cuando la siguiente palabra después de las declaraciones (si los hay) no es una palabra clave reconocida por compilador como un tipo (un EDT, mesa, clase, ...)

Por ejemplo:

void method1() 
{ 
    CustTable custTable; 

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

ERROR! como compilador no puede separar el bloque de declaración de clase del inicio del código X ++. Cuando el compilador lee la segunda línea, no sabe si custTable es una nueva variable o es parte del código X ++.Entonces, necesitas el punto y coma adicional para decir el compilador donde está el final de las declaraciones (realmente, dónde está el comienzo del código X ++).

void method1() 
{ 
    CustTable custTable; 

    if (custTable) 
    { 
     // stuff happens 
    }   
} 

WORKS! como el compilador sabe que no puede declarar una variable de tipo if (es una palabra clave reservada, obviamente) por lo que está claro que este es el comienzo del código X ++ y no puede declarar las variables después de esta línea.

Esto funciona de esa manera, incluso si no hay declaraciones de variables:

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

ERROR!custTable puede ser una decaración, o código X ++ como ese ejemplo.

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

WORKS! como return no puede ser una declaración.

EXTRA:

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

Esto debería funcionar (como info no es un tipo), ¿no es así? ... ¡pero no es así! ¿Por qué? Porque info es un método especial del núcleo que se reemplazará por su nombre completo: Global::info(), el primer token será Global después del reemplazo del precompilador, y Global es una clase.

Cuestiones relacionadas