Trước đó ngày hôm nay, như tôi đã mã hóa một phương pháp và nó đánh tôi rằng tôi đã không chắc chắn chính xác lý do tại sao thành ngữ tôi đã thực hiện biên dịch. Nếu mọi thứ khác là trừu tượng đi, nó sẽ giống như thế này:Các vòng lặp vô hạn được xử lý trong .NET có phải là trường hợp đặc biệt không?
private int Example()
{
while (true)
{
if (some condition)
{
return 1;
}
}
}
Bạn có một vòng lặp vô hạn một cách rõ ràng, và một số thiết lập các điều kiện bên trong vòng lặp mà gây ra vòng lặp kết thúc với một tuyên bố trở lại. Chúng ta hãy bỏ qua thời gian là lý do tại sao tôi đã làm điều này trái ngược với việc kiểm tra tình trạng chấm dứt trong mệnh đề while vì câu trả lời là phức tạp và không liên quan - điều tôi muốn biết là tại sao trình biên dịch không gắn cờ điều này với "Không tất cả các đường dẫn đều trả về một giá trị. " lỗi, như, nói đúng không phải tất cả các đường dẫn đều trả về một giá trị. Trường hợp trong đó vòng lặp while không bao giờ được nhập (dĩ nhiên, không bao giờ xảy ra) không trả về bất cứ thứ gì. Bây giờ, có hai lý do tôi có thể tưởng tượng nó xảy ra: đây là một tác dụng phụ của việc tối ưu hóa xảy ra vì các lý do khác, hoặc trường hợp này rõ ràng được xử lý bởi trình biên dịch để cho phép thành ngữ này. Bản năng của tôi là nó có lẽ là trường hợp đầu tiên. Ví dụ, điều này không làm tôi ngạc nhiên khi biên dịch này:
private int Example2()
{
if (true) return 1;
}
Bởi vì trình biên dịch thấy hằng số đúng trong trường hợp và tối ưu hóa điều kiện. Tôi không thực sự hiểu tại sao điều này sẽ "sửa" ví dụ đầu tiên.
Oh, và thậm chí nhiều hơn thật là thú vị, nếu một số tối ưu hóa mà được thoát khỏi vòng lặp là trong vở kịch, đây biên dịch:
private int Example3()
{
while (true)
{
if (false)
{
return 1;
}
}
}
tôi sẽ nghĩ rằng toàn bộ vòng lặp bên trong sẽ được tối ưu hóa đi, được thoát khỏi tất cả các lợi nhuận hợp lệ. Điều gì thực sự xảy ra ở đây ở cấp độ bytecode/trình biên dịch mà làm cho tất cả điều này có ý nghĩa?
Tôi nghĩ ví dụ cuối cùng là trường hợp trình biên dịch nói * "Tôi hy vọng họ biết họ đang làm gì ..... "* – ChaosPandion
+1 chưa bao giờ nghĩ đến những tình huống này. – Arun