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ể.
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
Trình biên dịch nào? Microsoft? Mono? khác? –
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