2010-05-06 25 views
13

Tôi chỉ tự hỏi nếu những khối mã được biên dịch vào .dllC# có biên dịch mã bên trong khối if (false) không?

Tôi không nghĩ rằng một này được biên dịch ở tất cả

#if SOMETHING_UNDEFINED 
// some code - this is ignored by the compiler 
#endif 

Bây giờ những gì về những?

1.

if(false) { 
    // some code - is this compiled? 
} 

2.

const bool F = false; 
if(F) { 
    // some code - is this compiled? 
} 

3.

bool F = false; 
if(F) { 
    // some code - is this compiled? 
} 

EDIT: Xin lỗi, tôi đang nói về Visual Studio

+3

Bạn có thể kiểm tra điều này một cách dễ dàng bằng cách sử dụng bộ phản xạ hoặc ILDasm. – Ikaso

+2

Trình biên dịch nào? Microsoft? Mono? khác? –

+0

Xin lỗi đó là Visual Studio, các trình biên dịch khác nhau có làm những việc khác nhau trên cùng một mã không? – Aximili

Trả lời

7

Chỉ cần thử nghiệm nó, Trình biên dịch Microsoft C# 4 không, và nó trông giống như phiên bản trình biên dịch mono gmcs 2.4.0.0 cũng vậy. Tôi không biết rằng có bất cứ điều gì trong spec cấm nó mặc dù.

EDIT: Khi tôi trả lời câu hỏi này, chỉ có phiên bản đầu tiên có mặt. Trường hợp 2 tương đương với trường hợp 1, nhưng trường hợp 3 thì không.

+0

cho cả ba trường hợp? – Justin

+2

Không, trường hợp cuối cùng được biên dịch vào trong hội đồng. –

+0

Cảm ơn bạn. Tôi đoán nó không quan trọng nếu hằng số là trong lớp khác hoặc thậm chí một dự án khác (trong Visual Studio), phải không? – Aximili

1

Chỉ cần phụ lục cho câu trả lời:

Lý do tôi tin là nó sẽ chỉ kiểm tra tĩnh. trong trường hợp đầu tiên nếu (false) nó sẽ thấy rằng đó là mã unreachable bởi một kiểm tra mẫu đơn giản, do đó, nó sẽ không biên dịch nó trong (cũng nên đưa ra một cảnh báo quá).

Đối với trường hợp thứ hai, vì F là hằng số và nó biết nó không bao giờ thay đổi, khi thực hiện kiểm tra tĩnh nó chỉ có thể thay thế. [F-> false] < < body >>. và điều đó sẽ cung cấp mã giống như mã đầu tiên.

Điều cuối cùng là khó khăn. Vì không thể biết rằng 100% sử dụng kiểm tra tĩnh chỉ những gì giá trị của F là. C# giống như tất cả các ngôn ngữ bắt buộc có tác dụng phụ.

tưởng tượng nếu bạn viết lại mã hơi

bool F = false; 
foo(ref F); 
if(F) { 
    // some code - is this compiled? 
} 

Vấn đề ở đây là, nó không biết gì foo không để F. để tìm hiểu, nó sẽ phải theo dõi (và có thể đánh giá) chức năng, bây giờ hãy tưởng tượng một chương trình rất lớn với rất nhiều mẫu, sau khi tất cả, nếu câu lệnh được sử dụng rất nhiều, cố gắng tìm giá trị thời gian chạy của F cho tất cả các câu lệnh này sẽ rất chậm và tốn thời gian và đôi khi thậm chí không thể.

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