Tôi đã đọc rất nhiều articles (và một số khác tương tự câu hỏi đã được đăng trên StackOverflow) về cách thức và thời điểm sử dụng xác nhận và tôi hiểu rõ chúng. Tuy nhiên, tôi vẫn không hiểu động lực nào sẽ thúc đẩy tôi sử dụng Debug.Assert
thay vì ném một ngoại lệ đơn giản. Những gì tôi có nghĩa là, trong .NET các phản ứng mặc định để một khẳng định không thành công là "ngăn chặn thế giới" và hiển thị một hộp thông báo cho người dùng. Mặc dù loại hành vi này có thể được sửa đổi, tôi thấy nó rất khó chịu và dư thừa để làm điều đó, trong khi tôi có thể thay thế, chỉ cần ném một ngoại lệ phù hợp. Bằng cách này, tôi có thể dễ dàng ghi lỗi vào nhật ký của ứng dụng ngay trước khi tôi ném ngoại lệ, và cộng với, ứng dụng của tôi không nhất thiết phải đóng băng.Debug.Assert vs Exception Throwing
Vì vậy, tại sao tôi nên sử dụng Debug.Assert
thay vì ngoại lệ đơn giản? Đặt một khẳng định nơi nó không nên có thể chỉ gây ra tất cả các loại "hành vi không mong muốn", do đó, theo quan điểm của tôi, tôi thực sự không đạt được bất cứ điều gì bằng cách sử dụng một khẳng định thay vì ném một ngoại lệ. Bạn có đồng ý với tôi hay tôi đang thiếu thứ gì đó ở đây?
Lưu ý: Tôi hoàn toàn hiểu sự khác biệt "về mặt lý thuyết" (Debug vs Release, mẫu sử dụng, v.v.), nhưng như tôi thấy, tôi sẽ tốt hơn khi ném một ngoại lệ thay vì thực hiện một khẳng định. Vì nếu một lỗi được phát hiện trên bản phát hành sản phẩm, tôi vẫn muốn rằng "xác nhận" sẽ thất bại (sau khi tất cả, "overhead" là ridiculously nhỏ), vì vậy tôi sẽ tốt hơn off ném một ngoại lệ để thay thế.
Edit: Con đường tôi nhìn thấy nó, nếu một khẳng định thất bại, điều đó có nghĩa rằng việc áp dụng vào một số loại hỏng nhà nước, bất ngờ. Vậy tại sao tôi muốn tiếp tục thực hiện? Nó không quan trọng nếu ứng dụng chạy trên một phiên bản gỡ lỗi hoặc phát hành. Tương tự với cả hai số
Đối với những điều bạn đang nói "nếu một lỗi được phát hiện trên bản phát hành sản xuất, tôi vẫn muốn rằng" xác nhận "sẽ thất bại", ngoại lệ là những gì bạn nên sử dụng –
Hiệu suất là lý do duy nhất. Null kiểm tra tất cả mọi thứ tất cả các thời gian có thể làm giảm tốc độ, mặc dù nó có thể hoàn toàn không đáng kể. Điều này chủ yếu cho các trường hợp không bao giờ nên xảy ra, ví dụ như bạn biết bạn đã kiểm tra nó đã có trong một chức năng trước đó, không có chu kỳ lãng phí điểm kiểm tra nó một lần nữa. Debug.assert hoạt động hiệu quả như một bài kiểm tra đơn vị cơ hội cuối cùng để thông báo cho bạn. – rolls