C # - Phương thức Assert () làm gì? Nó vẫn hữu ích chứ?


156

Tôi đang gỡ lỗi với các điểm dừng và tôi nhận ra cuộc gọi khẳng định? Tôi nghĩ rằng nó chỉ dành cho các bài kiểm tra đơn vị. Nó làm gì hơn điểm dừng? Vì tôi có thể dừng lại, tại sao tôi nên sử dụng Assert?


9
Nhân tiện, nếu bạn quan tâm đến việc khẳng định, bạn chắc chắn nên đi sâu vào các hợp đồng mã .
MasterMastic

Bản sao có thể có của stackoverflow.com/questions/129120/
Mạnh

Câu trả lời:


200

Trong quá trình biên dịch gỡ lỗi, Assertlấy một điều kiện Boolean làm tham số và hiển thị hộp thoại lỗi nếu điều kiện sai. Chương trình tiến hành mà không có bất kỳ gián đoạn nếu điều kiện là đúng.

Nếu bạn biên dịch trong Bản phát hành, tất cả Debug.Assertsẽ tự động bị bỏ qua.


12
Làm cách nào tôi có thể có hành vi tương tự của Debug.Assert trong chế độ Phát hành?
Hamish Grubijan

15
Trace.Assert cho chế độ phát hành dường như refs: msdn.microsoft.com/en-us/library/... msdn.microsoft.com/en-us/library/e63efys0.aspx
Tim Abell

8
@ HamishGrubijan Và tại sao bạn muốn Debug.Assertở chế độ phát hành?
Camilo Martin

25
IMO, bỏ qua các xác nhận từ mã phát hành cũng giống như thực hiện các cuộc tập trận xuồng cứu sinh trong khi cập cảng và sau đó để lại các xuồng cứu sinh phía sau khi bạn đi thuyền. :)
chrisd

113
Khẳng định không phải là xuồng cứu sinh, chúng là một hệ thống phát hiện tảng băng trôi. Vì người dùng không điều khiển con tàu, một mã xác nhận trong mã phát hành chỉ nói với họ rằng họ sẽ phải chịu số phận; nó không để họ tránh tảng băng trôi.
Stefan

97

Từ mã hoàn thành

8 Lập trình phòng thủ

8.2 Khẳng định

Một xác nhận là mã được sử dụng trong quá trình phát triển, thường là một chương trình macro hoặc macro cho phép chương trình tự kiểm tra khi nó chạy. Khi một khẳng định là đúng, điều đó có nghĩa là mọi thứ đang hoạt động như mong đợi. Khi nó sai, điều đó có nghĩa là nó đã phát hiện ra một lỗi không mong muốn trong mã. Ví dụ: nếu hệ thống giả định rằng tệp thông tin khách hàng sẽ không bao giờ có hơn 50.000 bản ghi, chương trình có thể chứa một xác nhận rằng số lượng bản ghi nhỏ hơn hoặc bằng 50.000. Miễn là số lượng hồ sơ ít hơn hoặc bằng 50.000, khẳng định sẽ im lặng. Tuy nhiên, nếu nó gặp hơn 50.000 bản ghi, tuy nhiên, nó sẽ lớn tiếng khẳng định rằng có lỗi trong chương trình.

Các xác nhận đặc biệt hữu ích trong các chương trình lớn, phức tạp và trong các chương trình có độ tin cậy cao. Chúng cho phép các lập trình viên nhanh chóng loại bỏ các giả định giao diện không khớp, các lỗi xuất hiện khi mã được sửa đổi, v.v.

Một xác nhận thường có hai đối số: một biểu thức boolean mô tả giả định được cho là đúng và một thông báo sẽ hiển thị nếu không.

(Càng)

Thông thường, bạn không muốn người dùng thấy thông báo xác nhận trong mã sản xuất; khẳng định chủ yếu để sử dụng trong quá trình phát triển và bảo trì. Các xác nhận thường được biên dịch thành mã tại thời điểm phát triển và được biên dịch ra khỏi mã để sản xuất. Trong quá trình phát triển, các xác nhận tuôn ra các giả định mâu thuẫn, các điều kiện bất ngờ, các giá trị xấu được truyền vào các thói quen, v.v. Trong quá trình sản xuất, chúng được biên dịch ra khỏi mã để các xác nhận không làm giảm hiệu năng hệ thống.


2
Cuốn sách, Viết Solid Code, cũng có một cuộc thảo luận tuyệt vời về việc sử dụng khẳng định. Chúng là một công cụ sửa lỗi tuyệt vời!
zooropa

39

Bạn nên sử dụng nó cho những lúc bạn không muốn phải ngắt từng dòng mã nhỏ để kiểm tra các biến, nhưng bạn muốn nhận được một số phản hồi nếu có tình huống nhất định, ví dụ:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

Nếu tôi thêm một dòng mã tương tự như mã của bạn ở trên, việc chạy chương trình của tôi sẽ gặp lỗi sau: "lỗi CS0103: Tên 'Gỡ lỗi' không tồn tại trong ngữ cảnh hiện tại". Tôi có cần một số loại sử dụng tuyên bố để làm cho nó hoạt động?
Josh Desmond

4
@JoshDesmondSystem.Diagnostics
Sinjai

16

Khẳng định cũng cung cấp cho bạn một cơ hội khác để cười thầm về các kỹ năng thiết kế UI của Microsoft. Ý tôi là: một hộp thoại có ba nút Hủy bỏ, Thử lại, Bỏ qua và giải thích về cách diễn giải chúng trong thanh tiêu đề!


3
Hủy bỏ / Thử lại / Bỏ qua là cổ điển! Có phải đó là những xác nhận đã từng khiến Windows 3.1 hiển thị điều này mọi lúc?
chúa tể

Về cơ bản, đó là vì nó sử dụng MessageBox, như bạn nói có từ thời Windows 3.1 và chỉ có nhãn nút được xác định trước. Vì vậy, bạn có thể hiểu tại sao vụ hack xuất hiện, nhưng không phải tại sao nó vẫn còn ở đó vào năm 2008!
Joe

4
@Joe Đây là thứ chỉ nên được nhìn thấy bởi các nhà phát triển không phải người dùng cuối nên việc cập nhật nó có lẽ là một mục ưu tiên cực kỳ thấp. Nếu nó làm phiền, bạn có thể sửa đổi các bộ sưu tập Debug.Listener hoặc Trace.Listener để thay thế trình xử lý mặc định bằng một bộ xử lý làm bất cứ điều gì bạn muốn.
Dan đang loay hoay bởi Firelight

5
Và giờ là năm 2019 và hộp thoại / nút tương tự vẫn còn ở đây!
Bouke

10

Khẳng định cho phép bạn xác nhận một điều kiện (bài hoặc tiền) áp dụng trong mã của bạn. Đó là một cách để ghi lại ý định của bạn và yêu cầu trình gỡ lỗi thông báo cho bạn một hộp thoại nếu ý định của bạn không được đáp ứng.

Không giống như điểm dừng, Assert đi cùng với mã của bạn và có thể được sử dụng để thêm chi tiết bổ sung về ý định của bạn.


10

Khẳng định có thể giúp bạn đưa ra hành vi nhắn tin riêng giữa thử nghiệm và phát hành. Ví dụ,

Debug.Assert(x > 2)

sẽ chỉ kích hoạt ngắt nếu bạn đang chạy bản dựng "gỡ lỗi", không phải bản dựng phát hành. Có một ví dụ đầy đủ về hành vi này ở đây


10

Trước hết Assert()phương pháp có sẵn cho TraceDebugcác lớp.
Debug.Assert()chỉ thực hiện trong chế độ Gỡ lỗi.
Trace.Assert()đang thực thi trong chế độ Gỡ lỗi và Phát hành.

Đây là một ví dụ:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

Chạy mã này trong chế độ Gỡ lỗi và sau đó ở chế độ Phát hành.

nhập mô tả hình ảnh ở đây

Bạn sẽ nhận thấy rằng trong chế độ Gỡ lỗi, Debug.Assertcâu lệnh mã của bạn không thành công, bạn nhận được một hộp thông báo hiển thị dấu vết ngăn xếp hiện tại của ứng dụng. Điều này không xảy ra trong chế độ Phát hành vì Trace.Assert()điều kiện là đúng (i == 4).

WriteLine() Phương thức đơn giản chỉ cung cấp cho bạn một tùy chọn ghi thông tin vào đầu ra Visual Studio. nhập mô tả hình ảnh ở đây


5

Các xác nhận đặc trưng rất nhiều trong Thiết kế theo Hợp đồng (DbC) mà theo tôi hiểu được giới thiệu / chứng thực bởi Meyer, Bertand. 1997. Tương phản phần mềm hướng đối tượng.

Một tính năng quan trọng là chúng không được tạo ra các hiệu ứng phụ, ví dụ bạn có thể xử lý một ngoại lệ hoặc thực hiện một hành động khác với một câu lệnh if (lập trình phòng thủ).

Các xác nhận được sử dụng để kiểm tra các điều kiện trước / sau của hợp đồng, mối quan hệ khách hàng / nhà cung cấp - khách hàng phải đảm bảo rằng các điều kiện trước của nhà cung cấp được đáp ứng, ví dụ. gửi £ 5 và nhà cung cấp phải đảm bảo các điều kiện hậu được đáp ứng, ví dụ. cung cấp 12 hoa hồng. (Chỉ cần giải thích đơn giản về khách hàng / nhà cung cấp - có thể chấp nhận ít hơn và cung cấp nhiều hơn, nhưng về Xác nhận). C # cũng giới thiệu Trace.Assert (), có thể được sử dụng cho mã phát hành.

Để trả lời câu hỏi, chúng vẫn hữu ích, nhưng có thể thêm độ phức tạp + khả năng đọc vào mã và thời gian + khó duy trì. Chúng ta vẫn nên sử dụng chúng? Vâng, tất cả chúng ta sẽ sử dụng chúng? Có lẽ là không, hoặc không đến mức mà Meyer mô tả.

(Ngay cả khóa học OU Java mà tôi đã học kỹ thuật này chỉ hiển thị các ví dụ đơn giản và phần còn lại của mã không thực thi các quy tắc xác nhận DbC trên hầu hết các mã, nhưng được cho là được sử dụng để đảm bảo tính chính xác của chương trình!)


3

Cách tôi nghĩ về nó là Debug.Assert là một cách để thiết lập một hợp đồng về cách gọi một phương thức, tập trung vào các chi tiết cụ thể về các giá trị của một tham số (thay vì chỉ loại). Ví dụ: nếu bạn không được gửi null trong tham số thứ hai, bạn thêm Assert xung quanh tham số đó để báo cho người tiêu dùng không làm điều đó.

Nó ngăn không cho ai đó sử dụng mã của bạn theo cách xương đầu. Nhưng nó cũng cho phép cách thức đi đầu để đi vào sản xuất và không đưa ra thông điệp khó chịu cho khách hàng (giả sử bạn xây dựng bản dựng Phát hành).


6
Tuy nhiên, điều quan trọng là chỉ ra rằng các tham số không hợp lệ trên các phương thức công khai sẽ đưa ra các ngoại lệ đối số. Chỉ các phương thức riêng tư mới xác nhận đầu vào với các xác nhận. Những giá trị đến từ bên ngoài luôn bị nghi ngờ!
Jeffrey L Whitledge
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.