2009-12-29 36 views
10

Như đã nói trong cuốn sách Microsoft Dynamics AX 2009 Lập trình: Bắt đầu Nó rất cần thiết để đặt dấu chấm phẩy sau khi khai báo trong x ++:Dấu chấm phẩy có thực sự cần thiết sau khi khai báo trong x ++ không?

Các dấu chấm phẩy thêm sau khi khai báo biến là bắt buộc chừng nào sự dòng mã đầu tiên không phải là từ khóa . Dấu chấm phẩy cho trình biên dịch mà các khai báo biến đã kết thúc. Bạn không thể khai báo các biến mới sau dấu chấm phẩy này.

(sao chép trực tiếp từ cuốn sách, không thay đổi, nếu cần thiết Tôi sẽ loại bỏ nó)

Tuy nhiên, khi tôi loại bỏ các dấu chấm phẩy và chạy các công việc, there's hoàn toàn không có lỗi hoặc vấn đề:

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

công trình giống như

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

    print string1; 
    pause; 
} 

Liệu nó thực sự cần thiết? tôi có nên quen với việc sử dụng nó không?

+0

Tôi sắp hỏi cùng một câu hỏi khi tôi gặp http://msdn.microsoft.com/en-us/library/cc967415.aspx. Câu hỏi hay! –

+0

để biết thêm thông tin: http://blogs.msdn.com/b/mfp/archive/2008/04/24/what-s-up-with-this-semicolon.aspx –

+0

Câu trả lời của bạn ở ngay trong định nghĩa. "bắt buộc miễn là dòng mã đầu tiên không phải là từ khóa". 'print' là một từ khóa. – SShaheen

Trả lời

13

Nó được giải thích khá thanh lịch here.

Một câu nói quan trọng:

"Lý do bạn cần có thêm dấu chấm phẩy là bởi vì trình biên dịch có thể không bao giờ nhìn thấy nơi khai báo biến cuối Nếu bạn không giúp đỡ một chút, nó sẽ. đoán và không tốt lắm ở số đoán. "

+2

Tôi đã thấy bạn không thực sự thành x ++ và động lực (dựa trên câu hỏi và câu trả lời của bạn) bạn có tìm kiếm nó không? cũng được tìm thấy! – Marcelo

5

Bạn chỉ cần dấu chấm phẩy nếu phần thân của mã không bắt đầu bằng từ khóa. Trong ví dụ của bạn, mã của bạn bắt đầu bằng print, được xây dựng trong từ khóa. Nếu bạn đã cố gắng bắt đầu viết mã với: string1+=".COM"; bạn sẽ gặp lỗi.

Dynamics AX 2009 là phiên bản AX cuối cùng sẽ yêu cầu dấu chấm phẩy phụ. AX 6.0 nên khắc phục điều này: mfp's two cents: What's up with this semicolon?

6

Với việc phát hành AX 2012, không cần phải đặt dấu chấm phẩy bổ sung sau khi khai báo biến.

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

+4

Nói đúng, điều này không đúng: http://msdn.microsoft.com/en-us/library/cc641200.aspx "Bắt đầu từ Microsoft Dynamics AX 2012 bạn hiếm khi cần bao gồm dấu chấm phẩy trước câu lệnh đầu tiên trong Tuy nhiên, bạn cần dấu chấm phẩy trong các phương thức X ++ gọi các phương thức tĩnh trong .NET Framework. " Thêm thông tin tại đây: http://erptechnician.net/2012/06/30/method-not-found-error-xpp-call-static-method-dotnet-class/ Đó là những trường hợp, tuy nhiên hiếm khi chúng có thể là, khi dấu chấm phẩy được yêu cầu ngay cả trong AX 2012. – 10p

4

Bạn thực sự không cần dấu chấm phẩy đáng yêu (bạn không nhận được một lỗi biên dịch) khi từ kế tiếp sau khi tờ khai (nếu có) không phải là một từ khóa được công nhận bởi compilator như một kiểu (một EDT, bảng, lớp, ...)

Ví dụ:

void method1() 
{ 
    CustTable custTable; 

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

LỖI! vì trình biên dịch không thể tách riêng khối khai báo lớp khi bắt đầu mã X ++. Khi compilator đọc dòng thứ hai, nó không biết nếu custTable là một biến mới hay là một phần của mã X ++.Vì vậy, bạn cần thêm dấu chấm phẩy để nói trình biên dịch ở đâu là kết thúc khai báo (thực sự, đâu là bắt đầu của mã X ++).

void method1() 
{ 
    CustTable custTable; 

    if (custTable) 
    { 
     // stuff happens 
    }   
} 

HOẠT ĐỘNG! như trình biên dịch biết rằng bạn không thể khai báo biến kiểu if (đó là từ khóa dành riêng, rõ ràng) vì vậy rõ ràng đây là phần đầu của mã X ++ và bạn không thể khai báo biến sau dòng này.

này hoạt động theo cách mà ngay cả nếu không có khai báo biến:

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

LỖI!custTable có thể là giải mã hoặc mã X ++ giống như ví dụ đó.

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

HOẠT ĐỘNG!return không thể là khai báo.

EXTRA:

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

này nên làm việc (như info không phải là một loại), phải không? ... nhưng không! Tại sao? Bởi vì info là một phương pháp hạt nhân đặc biệt sẽ được thay thế bằng tên đầy đủ của nó: Global::info(), mã thông báo đầu tiên sẽ là Global sau khi thay thế trình biên dịch trước, và Global là một lớp.

Các vấn đề liên quan