Câu lệnh using (...) là cú pháp đường để thử {} cuối cùng {}.Sử dụng câu lệnh và try-catch() - cuối cùng là lặp lại?
Nhưng nếu tôi sau đó có một tuyên bố sử dụng như dưới đây:
using (FileStream fs = File.Open(path))
{
}
Bây giờ tôi muốn nắm bắt những trường hợp ngoại lệ rằng việc mở tập tin này có thể gây ra (và điều này là mã có nguy cơ khá cao ở chỗ nó có thể thất bại do môi trường), nhưng nếu tôi viết try-catch bên trong sẽ không được lặp lại? Khi mã được biên dịch sang IL, tôi cho rằng sự lặp lại sẽ bị xóa khi mã được JITted?
Tuy nhiên, tôi muốn nắm bắt các ngoại lệ khi mở tệp có thể gây ra (vì vậy tôi nên bọc thử bên ngoài phạm vi của câu lệnh) và cũng là ngoại lệ cho bất kỳ điều gì tôi thực hiện trong khối sử dụng. việc cố gắng nắm bắt bên trong khối.
Điều này có vẻ như tôi đang thêm rất nhiều sự lặp lại cho những gì CLR có thể làm bên trong. CLR có thêm mệnh đề bắt không?
Đồng nghiệp của tôi lập luận rằng câu lệnh sử dụng lộn xộn (nhưng điều này là do một dòng duy nhất hơi dài do tôi mã hóa chúng khi tôi cần thay đổi chúng rất nhanh và không có quyền truy cập vào các phần khác của mã căn cứ). Đồng nghiệp cho biết không sử dụng tuyên bố sử dụng nhưng có bao giờ có bất kỳ sự khác biệt chức năng nào giữa câu lệnh sử dụng và try-finally/try-catch-finally không? Tôi đã thấy một trường hợp này, nơi các dịch vụ WCF có một trường hợp góc không nổi tiếng về việc sử dụng các giá trị cuối cùng và trả về (một cái gì đó về cuối cùng). Giải pháp là sử dụng một khối kiểm tra. Có bất cứ điều gì như thế này trong C#?
Một lưu ý khác là tất cả các loại triển khai IDisposale chủ sở hữu tài nguyên không được quản lý? Một cuộc thảo luận với bạn tôi đã chỉ ra câu trả lời là không. (Tôi cũng đã đọc một số chủ đề trong phần sử dụng của diễn đàn này, một số kiến thức rất tốt ở đó).
Sử dụng hỗ trợ cuối cùng mặc dù? Bạn đã tìm hiểu về cách sử dụng, sử dụng khối phạm vi ẩn danh ở đâu? Tôi muốn biết thêm về điều này. Vì vậy, khi tôi mở một tập tin trong một khối sử dụng (ví dụ như FileSream.Open()), ngoại lệ này sẽ bong bóng lên. Nếu câu lệnh sử dụng thực hiện try/finally, tôi phải bọc nó trong try/catch chỉ để có catch. – dotnetdev