Đô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ư
nullvà-1); - ném một ngoại lệ (ví dụ
KeyNotFoundException); - trả về
falsevà cung cấp giá trị trả về thực tế trong mộtouttham 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 outtham số ? (Đối với tôi, outtham 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>.IndexOftrả về -1,StreamReader.Readtrả về -1,Math.Sqrttrả lại NaN,Hashtable.Itemtrả về null;
- ném một ngoại lệ:
Dictionary<,>.Itemném KeyNotFoundException,Double.Parseném FormatException; hoặc là
- trả về
falsevà cung cấp giá trị trả về thực tế trong mộtouttham 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 objectvà do đó có thể trở lại nullnhư 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- TryGetValuevà Parse- TryParselưỡ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<,>.Itemtồn tại.