Đôi khi tôi cuối cùng phải viết một phương thức hoặc thuộc tính cho một thư viện lớp mà không có câu trả lời thực sự nào, nhưng đó là một thất bại. Một cái gì đó không thể được xác định, không có sẵn, không tìm thấy, hiện không thể hoặc không có thêm dữ liệu.
Tôi nghĩ có ba giải pháp khả thi cho một tình huống tương đối không đặc biệt như vậy để chỉ ra sự thất bại trong C # 4:
- trả về một giá trị ma thuật không có ý nghĩa khác (như
null
và-1
); - ném một ngoại lệ (ví dụ
KeyNotFoundException
); - trả về
false
và cung cấp giá trị trả về thực tế trong mộtout
tham số, (chẳng hạn nhưDictionary<,>.TryGetValue
).
Vì vậy, các câu hỏi là: trong trường hợp không đặc biệt nào tôi nên ném một ngoại lệ? Và nếu tôi không nên ném: khi nào trả về một giá trị ma thuật được xác định ở trên thực hiện một Try*
phương thức với một out
tham số ? (Đối với tôi, out
tham số có vẻ bẩn và sử dụng đúng cách sẽ tốn nhiều công sức hơn.)
Tôi đang tìm kiếm câu trả lời thực tế, chẳng hạn như câu trả lời liên quan đến hướng dẫn thiết kế (tôi không biết gì về Try*
phương pháp), tính khả dụng (khi tôi hỏi điều này đối với thư viện lớp), tính nhất quán với BCL và khả năng đọc.
Trong Thư viện lớp cơ sở .NET Framework, cả ba phương thức đều được sử dụng:
- trả về một giá trị ma thuật không có ý nghĩa khác:
Collection<T>.IndexOf
trả về -1,StreamReader.Read
trả về -1,Math.Sqrt
trả lại NaN,Hashtable.Item
trả về null;
- ném một ngoại lệ:
Dictionary<,>.Item
ném KeyNotFoundException,Double.Parse
ném FormatException; hoặc là
- trả về
false
và cung cấp giá trị trả về thực tế trong mộtout
tham số:
Lưu ý rằng như Hashtable
được tạo ra vào thời điểm khi không có tướng trong C #, nó sử dụng object
và do đó có thể trở lại null
như một giá trị ma thuật. Nhưng với thuốc generic, các trường hợp ngoại lệ được sử dụng Dictionary<,>
và ban đầu nó không có TryGetValue
. Rõ ràng cái nhìn sâu sắc thay đổi.
Rõ ràng, Item
- TryGetValue
và Parse
- TryParse
lưỡng tính là có một lý do, vì vậy tôi cho rằng ném ngoại lệ cho những thất bại không phải là đặc biệt là trong C # 4 không được thực hiện . Tuy nhiên, các Try*
phương thức không phải lúc nào cũng tồn tại, ngay cả khi Dictionary<,>.Item
tồn tại.