2011-01-25 22 views
13

Tôi đang viết một tuyên bố và nó biên dịch, nhưng trình biên dịch [VS] không bao giờ nói với tôi rằng tôi đặt dấu chấm phẩy hai lần.Có C# cho phép dấu chấm phẩy đôi; ; nếu có, có cách nào đặc biệt không?

Điều này có nghĩa trong ASP.NET MVC 3

return Json(mydata);; 

return Json(mydata); 

Cả hai người biên dịch, nhưng người đầu tiên là sai trong mẫu thiết kế. Tại sao nó không cho tôi biết về hai dấu chấm phẩy.

Nếu không có lý do gì để sử dụng hai dấu chấm phẩy, tại sao nó không hiển thị lỗi?

Nếu có cách sử dụng đặc biệt, vui lòng chỉ cho tôi biết hai dấu chấm phẩy được yêu cầu để viết một câu lệnh trong C#.

Trả lời

19

Không, một dấu chấm phẩy kép không bao giờ được yêu cầu. Tôi hơi ngạc nhiên khi trình biên dịch không phàn nàn rằng đó là một tuyên bố không thể truy cập, nhưng dường như nó hợp pháp. Nó sẽ không gây hại gì, nhưng cũng không phải là một ý hay.

+2

Tại sao nó hoàn toàn có thể truy cập được, chỉ cần để trống – Dyppl

+1

@Stook: Làm cách nào để có thể truy cập sau tuyên bố trả lại vô điều kiện? Thử đặt bất kỳ câu lệnh nào khác ở đó (ví dụ: một khai báo biến) và trình biên dịch đưa ra một cảnh báo. –

+0

oh xin lỗi, tôi đã không chú ý đủ để một ví dụ thực tế, xấu của tôi. – Dyppl

1

Hiện tại, không có lý do cụ thể nào để viết dấu chấm phẩy đôi vào tâm trí của tôi. Theo như tôi biết Visual Studio chỉ phàn nàn về dấu chấm phẩy có thể dẫn đến một hành vi không mong muốn, như đoạn sau đây:

if (true) 
    ; 

như dấu chấm phẩy là một lệnh trống, toàn bộ if-khoản được vô hiệu. Visual Studio phàn nàn về tất cả các cấu trúc như vậy (sử dụng, cho, foreach, vv) mà không có dấu ngoặc xung quanh chúng.

Vì vậy, các mã sau đây là tốt cho VS:

if (true) 
{ 
     ; 
} 
2

; - dấu phân tách câu lệnh. Dấu chấm phẩy kép chứa empty statement, không làm gì cả.

Sử dụng tuyên bố rỗng:

while (Method()) 
    ; 

Hoặc

void F() { 
    //... 
    if (done) goto exit; 
    //... 
    exit: ; 
} 

Như bạn có thể thấy, hành vi này là đúng. Nhưng trong ví dụ của bạn, bạn sẽ có mã không thể truy cập với câu lệnh trống.

6

Câu lệnh trống có giá trị trong tất cả ngôn ngữ có nguồn gốc từ C. Việc sử dụng thành ngữ phổ biến nhất là trong câu lệnh for, ví dụ .:

for (; ;) 
{ 
} 

if their is a special use of it then show me where two semicolon is required to write a statement in c#

Trong ví dụ trên, hai dấu chấm phẩy được yêu cầu của khóa học.

+0

Tại sao không sử dụng trong khi (đúng) vòng lặp thay thế? –

4

Đó là một đôi ;; được phép, là vì lý do lịch sử. Đó là một sự nôn nao từ các ngôn ngữ kiểu C (C# được dựa trên).

C & C++ có khái niệm về các macro tiền xử lý được thay thế trong mã trước khi mã được biên dịch, ví dụ:tầm thường ví dụ AddAndSquare là một vĩ mô, không phải là một chức năng

#define AddAndSquare(X,Y) (X+Y)*(X+Y) 
int Foo() { 
    int a = 1, b = 2; 
    return AddAndSquare(a, b); 
} 

đi vào trình biên dịch như

int Foo() { 
    int a = 1, b = 2; 
    return (A+B)*(A+B); 
} 

Bạn có thể xác định lại các macro để thể khác nhau để định nghĩa ban đầu của họ, bạn cũng có thể xác định lại họ để họ don' t tồn tại chút nào.

Đưa ra macro xác nhận #define ASSERT(c) if(!c) throw new AssertionFailedException() bạn có thể có mã hóa được phân tích bằng câu lệnh ASSERT.

void Foo(int x) { 
    int y = x + 2; 
    ASSERT(y != 0); 
    int z = x/y; 
    . . . . 
} 

Bây giờ xem xét rằng bạn chỉ muốn khẳng định trong debug xây dựng, nhưng không phải trong phiên bản xây dựng, phát hành bạn xác định lại vĩ mô để có sản phẩm nào (theo nghĩa đen #define ASSERT). Bây giờ khi Foo đi vào trình biên dịch cho một thông cáo xây dựng, nó trông như thế này

void Foo(int x) { 
    int y = x + 2; 
    ; 
    int z = x/y; 
    . . . . 
} 

Có bây giờ là một tuyên bố trống nơi ASSERT là, bởi vì có thể hoặc không thể là một tuyên bố đó (tùy thuộc vào xây dựng cấu hình), trình biên dịch cần có khả năng xử lý một câu lệnh trống.

Tại sao quy ước này được giữ trong C# nơi không có gì giống như C macro, tôi không có ý tưởng, nhưng có thể vì nó gây ra ít hoặc không có hại.

Tôi đoán rằng nhiều ; được trình biên dịch ưu tiên trước khi nó bắt đầu phân tích mã, do đó trình biên dịch của bạn không thể truy cập ;.

4

Có sự khác biệt giữa "không có lý do gì để sử dụng chúng" và "không hợp lệ để sử dụng chúng". Tại sao ngôn ngữ nên lãng phí thời gian và công sức ngăn cản bạn làm điều này, khi nó vô hại?

0

Trình biên dịch C# không cho phép ;; giữa if and else không có dấu ngoặc và trình biên dịch sẽ phát sinh lỗi trong trường hợp dưới đây.

if (condition == true) 
       ; ; 
      else 
       ; 

Lỗi trình biên dịch:

Error CS1513 } expected and one warning "Possible mistaken empty statement" 

Vì vậy, nếu bạn loại bỏ một semicolon nó sẽ làm việc một cách hoàn hảo (hoặc bạn cần phải thêm dấu ngoặc).

+1

'if (int.Phân tích cú pháp ("1") == 1) { \t \t \t; \t \t} \t \t; \t \t else { \t \t \t \t \t} '---- Đây là những gì mã của bạn là. Vấn đề là một phần hơi nhàm chán hơn, bạn có một 'else' mà không có' if' được liên kết. ';' Có thể là bất kỳ câu lệnh nào ở đây. –

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