Bạn sẽ coi loại ngoại lệ tốt nhất nào để ném khi phương thức mở rộng được gọi trên một cá thể rỗng (trong đó phương thức mở rộng không cho phép nó)? Vì các phương thức mở rộng là gì, nhưng các phương thức tĩnh bạn có thể tranh luận rằng nó nên là ArgumentNullException, nhưng mặt khác chúng được sử dụng như các phương thức ví dụ để nó có thể tự nhiên hơn khi sử dụng NullReferenceException. Hãy lấy ví dụ sau:ArgumentNullException hoặc NullReferenceException từ phương pháp mở rộng?
public static string ToInvariantString(this IFormattable value, string format)
{
return value.ToString(format, CultureInfo.InvariantCulture);
}
Bằng cách này, NullReferenceException sẽ bị ném nếu tham số giá trị rỗng.
Ví dụ khác sẽ là:
public static string ToInvariantString(this IFormattable value, string format)
{
if (value == null) throw new ArgumentNullException("value");
return value.ToString(format, CultureInfo.InvariantCulture);
}
EDIT: Trong một số các câu trả lời bạn đã chỉ ra rằng một phương pháp khuyến nông có thể được gọi như một phương pháp tĩnh và trong những trường hợp ngoại lệ tham chiếu null sẽ là sai, đó là một điểm tuyệt vời, và thực sự là một trong những mối quan tâm của tôi, không chắc chắn lý do tại sao tôi quên đề cập đến trong câu hỏi ở nơi đầu tiên.
Một người nào đó cũng chỉ ra rằng việc ném NullReferenceException là sai, và có, đúng vậy. Đó là lý do tại sao tôi không ném nó, tôi chỉ để cho nó xảy ra (để CLR ném nó) bằng cách không bảo vệ phương pháp. Tôi nghĩ rằng tôi ủng hộ ArgumentNullException (đó là những gì tôi đã sử dụng cho đến nay) nhưng tôi vẫn nghĩ rằng có ít nhất là phòng để tranh luận chống lại NullReferenceException vì nó có vẻ tự nhiên hơn ở hầu hết các nơi mà phương pháp sẽ được dùng.
Ý kiến tuyệt vời và như tôi đề cập trong chỉnh sửa của tôi về bài viết này là lý do tôi không rõ ràng ném NullReferenceException, tôi vẫn để CLR ném nó. –
"Một tham chiếu null không thực sự xảy ra". Có nó đã làm; bạn đã thông qua một tham chiếu null và phương thức đã cố gắng dereference nó. – piedar
@piedar phương pháp đã cố gắng dereference nó, không phải là thời gian chạy! –