Tôi đồng ý với hầu hết các bài viết ở đây, có xu hướng null
.
Lý do của tôi là việc tạo ra một đối tượng trống với các thuộc tính không thể rỗng có thể gây ra lỗi. Ví dụ: một thực thể có thuộc int ID
tính sẽ có giá trị ban đầu làID = 0
hoàn toàn hợp lệ. Nếu đối tượng đó, trong một số trường hợp, được lưu vào cơ sở dữ liệu, nó sẽ là một điều xấu.
Đối với bất cứ điều gì với một trình vòng lặp, tôi sẽ luôn sử dụng bộ sưu tập trống. Cái gì đó như
foreach (var eachValue in collection ?? new List<Type>(0))
là mùi mã theo ý kiến của tôi. Bộ sưu tập thuộc tính không nên là null, bao giờ hết.
Một trường hợp cạnh là String
. Nhiều người nói, String.IsNullOrEmpty
không thực sự cần thiết, nhưng bạn không thể luôn phân biệt giữa một chuỗi rỗng và null. Hơn nữa, một số hệ thống cơ sở dữ liệu (Oracle) sẽ không phân biệt giữa chúng ( ''
được lưu trữ dưới dạng DBNULL
), vì vậy bạn buộc phải xử lý chúng như nhau. Lý do cho điều đó là, hầu hết các giá trị chuỗi đều đến từ đầu vào của người dùng hoặc từ các hệ thống bên ngoài, trong khi cả hộp văn bản và hầu hết các định dạng trao đổi đều có các cách biểu diễn khác nhau cho ''
và null
. Vì vậy, ngay cả khi người dùng muốn xóa một giá trị, anh ta không thể làm gì hơn là xóa điều khiển đầu vào. Ngoài ra, sự khác biệt của nvarchar
các trường cơ sở dữ liệu nullable và không nullable là đáng nghi ngờ hơn, nếu DBMS của bạn không phải là orory - một trường bắt buộc cho phép''
là lạ, giao diện người dùng của bạn sẽ không bao giờ cho phép điều này, vì vậy các ràng buộc của bạn không ánh xạ. Vì vậy, câu trả lời ở đây, theo tôi là, xử lý chúng như nhau, luôn luôn.
Liên quan đến câu hỏi của bạn liên quan đến ngoại lệ và hiệu suất: Nếu bạn đưa ra một ngoại lệ mà bạn không thể xử lý hoàn toàn trong logic chương trình của mình, bạn phải hủy bỏ, tại một số điểm, bất kể chương trình của bạn đang làm gì và yêu cầu người dùng làm lại bất cứ điều gì anh ta vừa làm. Trong trường hợp đó, hình phạt hiệu suất của a catch
thực sự là ít lo lắng nhất của bạn - phải hỏi người dùng là con voi trong phòng (có nghĩa là hiển thị lại toàn bộ UI hoặc gửi một số HTML qua internet). Vì vậy, nếu bạn không tuân theo mô hình chống " Dòng chảy chương trình với ngoại lệ ", đừng bận tâm, hãy ném nó nếu nó hợp lý. Ngay cả trong các trường hợp đường biên, chẳng hạn như "Ngoại lệ xác thực", hiệu suất thực sự không phải là vấn đề, vì bạn phải hỏi lại người dùng, trong mọi trường hợp.
if (!DataExists)
.