Đó 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 ;
.
Tại sao nó hoàn toàn có thể truy cập được, chỉ cần để trống – Dyppl
@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. –
oh xin lỗi, tôi đã không chú ý đủ để một ví dụ thực tế, xấu của tôi. – Dyppl