Sự hiểu biết của bạn là đúng. Nghe có vẻ như cố gắng tối ưu hóa vi mô đối với tôi. Bạn nên sử dụng một diễn viên bình thường khi bạn chắc chắn về loại. Bên cạnh việc tạo ra một ngoại lệ hợp lý hơn, nó cũng thất bại nhanh chóng. Nếu bạn sai sắp giả định của bạn về loại, chương trình của bạn sẽ thất bại ngay lập tức và bạn sẽ có thể thấy nguyên nhân của sự thất bại ngay lập tức thay vì chờ đợi cho một NullReferenceException
hoặc ArgumentNullException
hoặc thậm chí một đôi khi lỗi logic trong tương lai. Nói chung, một as
biểu thức không được theo sau bởi một null
kiểm tra ở đâu đó là mùi mã.
Mặt khác, nếu bạn không chắc chắn về dàn diễn viên và hy vọng nó sẽ thất bại, bạn nên sử dụng as
thay vì một diễn viên bình thường được bọc bằng một try-catch
khối. Hơn nữa, việc sử dụng as
được khuyến nghị đối với kiểm tra loại tiếp theo là diễn viên. Thay vì:
if (x is SomeType)
((SomeType)x).SomeMethod();
trong đó tạo ra một isinst
hướng dẫn cho is
từ khóa và một castclass
hướng dẫn cho các diễn viên (thực hiện hiệu quả các diễn viên hai lần), bạn nên sử dụng:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Điều này chỉ tạo ra một isinst
hướng dẫn. Phương thức trước đây có một lỗ hổng tiềm năng trong các ứng dụng đa luồng vì điều kiện chủng tộc có thể khiến biến số thay đổi loại sau khi is
kiểm tra thành công và thất bại tại đường truyền. Phương pháp sau không dễ bị lỗi này.
Các giải pháp sau đây không được khuyến khích sử dụng trong mã sản xuất. Nếu bạn thực sự ghét một cấu trúc cơ bản như vậy trong C #, bạn có thể xem xét chuyển sang VB hoặc một số ngôn ngữ khác.
Trong trường hợp một người tuyệt vọng ghét cú pháp diễn viên, anh ấy / cô ấy có thể viết một phương thức mở rộng để bắt chước diễn viên:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
và sử dụng cú pháp [?] gọn gàng:
obj.To<SomeType>().SomeMethod()