Từ MSDN:Có bao giờ một lý do cho việc ném một ngoại lệ từ một chuyển đổi ngầm không?
Bằng cách loại bỏ các phôi không cần thiết, chuyển đổi ngầm có thể cải thiện khả năng đọc mã nguồn. Tuy nhiên, bởi vì các chuyển đổi tiềm ẩn có thể xảy ra mà không có sự chỉ định của người lập trình, việc chăm sóc phải được thực hiện để ngăn chặn những bất ngờ khó chịu. Nói chung, các nhà khai thác chuyển đổi tiềm ẩn không bao giờ nên ném ngoại lệ và không bao giờ mất thông tin để chúng có thể được sử dụng một cách an toàn mà không có sự nhận thức của người lập trình. Nếu một nhà điều hành chuyển đổi không thể đáp ứng các tiêu chí đó, nó phải được đánh dấu rõ ràng.
Mặc dù tôi không đồng ý với bất kỳ điểm cụ thể nào và tôi đồng ý rằng điều này rất tốt, có lý do nào đủ lớn để đảm bảo vi phạm phần chuyển đổi tiềm ẩn không ném ngoại lệ không?
Các trường hợp cụ thể tôi đã nói rồi tôi là một trong những nơi:
- Tôi có một chức năng, mà trả về một đối tượng sưu tập tùy chỉnh (chúng tôi sẽ gọi nó là
FooCollection
). - Chức năng này có thể trả lại các bộ sưu tập với một mục duy nhất và nó có thể được xác định từ mã nguồn cho dù điều này có xảy ra hay không. (bằng cách này, tôi có nghĩa là chỉ gọi hàm, chứ không phải chính hàm)
- Nếu điều đó xảy ra, có khả năng người dùng muốn có một mục duy nhất là 99,9% chứ không phải là một tập hợp với một mục duy nhất.
Bây giờ, tôi đang tung lên xem có nên bao gồm một chuyển đổi ngầm từ FooCollection
=>Foo
để ẩn ít chi tiết thực hiện điều này, nhưng chuyển đổi này sẽ chỉ làm việc nếu có một mục duy nhất trong bộ sưu tập.
Bạn có muốn ném một số Exception
trong trường hợp này không? Hoặc tôi có nên sử dụng dàn diễn viên rõ ràng thay thế không? Bất kỳ ý tưởng khác về cách tôi có thể đối phó với điều này (không, do chi tiết thực hiện tôi không thể chỉ sử dụng hai chức năng)?
EDIT: tôi cảm thấy nó xứng đáng với lưu ý rằng FooCollection
không thực hiện bất kỳ giao diện hoặc thực sự mở rộng Collection
như tên gọi có thể hàm ý, vì thế mà câu trả lời LINQ dựa là vô ích. Ngoài ra, trong khi bộ sưu tập thực hiện một chỉ mục số, nó không phải là cách trực quan nhất để giải quyết bộ sưu tập vì nó dựa vào chỉ mục có tên chủ yếu.
'Foo x = (Foo) fooCollection' sẽ không được 'đúng' hoặc (mặc dù nó sẽ biên dịch). 'Foo x = (Foo) fooCollection.x()' sẽ là cách nó sẽ được sử dụng. –
x() là hàm trả về một tập con của 1 mục từ fooCollection. –
Cũng vui lòng xem chỉnh sửa của tôi trong câu hỏi. –