2011-12-27 21 views
6

Có thể trong C# để biết từ tài liệu MSDN rằng một số phương thức/thuộc tính/trường có thể hoặc không thể trả về giá trị null?Đảm bảo bất động sản không thể trả về null

ví dụ: Image.RawFormat Tài sản từ MSDN cho biết:

ImageFormat đại diện cho định dạng tệp của Hình ảnh này.

Nó có thể trả về giá trị không? Tôi có nên thực hiện kiểm tra null trong mã của tôi hoặc nó luôn luôn không phải là null?

+0

Bạn đang đề cập đến điều này: http://msdn.microsoft.com/en-us/library/system.drawing.image.rawformat.aspx? – zmbq

+0

Hợp đồng mã là tốt cho loại điều này. – Amy

+0

Và MSDN sử dụng hợp đồng mã nào? –

Trả lời

4

Tôi tin rằng đối với bất kỳ giá trị đầu vào nào (ví dụ: không được mã của bạn cung cấp), bạn nên thực hiện kiểm tra xác thực. Ngay cả khi bạn nhìn thấy trong MSDN rằng nó không thể trả lại null bây giờ, nó có thể thay đổi trong tương lai và đó là một thực hành tốt anyway.

+0

Nhưng nếu tôi làm như vậy, tôi sẽ nhận được Mức độ phù hợp thấp hơn! Không? –

+0

Tôi bỏ lỡ sự hiểu biết về việc sử dụng "độ bao phủ mã thấp hơn" tại chủ đề này. cụm từ này, theo như tôi biết, đề cập đến cấp độ kiểm tra bạn đã thực hiện cho mã của mình. như "có bao nhiêu trường hợp bạn có thể bao gồm?". dù sao nó sẽ làm cho mã của bạn an toàn hơn. mặt duy nhất xuống là bạn mất hiệu suất nhưng nó có thể quá thấp nó sẽ không thể đo lường được. –

+0

Vâng, bạn hiểu tôi một cách chính xác. Khi tôi chạy một số công cụ bảo vệ mã, nó đo lường mã của tôi được thử nghiệm tốt như thế nào (với một số khung xUnit) - vì vậy tôi sẽ mất một số phần trăm bảo hiểm nếu tôi sẽ có mã chết sẽ không bao giờ được gọi và do đó không có sẵn để thử nghiệm. –

1

Tôi không nghĩ rằng có được bảo đảm cách để kể từ tài liệu, nhưng thường sẽ nói nếu nó có thể là rỗng. Ví dụ, nếu bạn nhìn vào các tài liệu cho System.Windows.Documents.Inline.NextInline, nó nói:

Một Inline đối tượng đại diện cho yếu tố Inline tiếp theo đó là một peer đến yếu tố này, hoặc null nếu không có yếu tố Inline tới.

Bất kể, nếu chương trình của bạn không thể xử lý một giá trị null và bạn có một thể hiện của một loại tài liệu tham khảo, bạn nên vẫn thực hiện xác nhận phù hợp với null.

+0

Đáng buồn thay, những gì bạn đang nói về MSDN không luôn luôn áp dụng. Hãy tìm ví dụ tại http://msdn.microsoft.com/en-us/library/ system.windows.application.current (v = vs.95) .aspx.Tất nhiên nó có ý nghĩa rằng thuộc tính là null trong ứng dụng không phải WPF, nhưng nó không được khai báo rõ ràng ở đó –

+0

@ MatějZábský: Có, tài liệu không Có vẻ như rằng nếu nó là "quan trọng" (hoặc phổ biến) đủ để đề cập đến khả năng của null, nó sẽ ở đó – bobbymcr

1

Tính năng chia sẻ lại sẽ cảnh báo bạn khi bạn sử dụng đối tượng không thể được chứng minh là không rỗng (ví dụ bằng cách xem thuộc tính NotNull hoặc bằng cách xem phương thức được gọi tự kiểm tra) - và không phô trương cung cấp thêm séc với một hoặc hai cú nhấp chuột.

Bằng cách này bạn có thể tránh xả rác mã của mình bằng séc khi không cần thiết.

Ngoài ra, thường sử dụng Debug.Assert là đủ để thực hiện kiểm tra "không-nhưng-nếu-nếu" (nơi bạn phải chấm dứt bất kỳ mã nào đang hoạt động).

+0

Thậm chí trình biên dịch C# sẽ cảnh báo bạn, ví dụ như 'int i = null' – abatishchev

+1

Nhưng nó sẽ không cảnh báo bạn trong tình huống như "đối tượng o = null; str s = o.ToString()", đó là những gì OP đang hỏi về. –

0

Không có cách nào để đảm bảo rằng loại có thể vô hiệu sẽ không trả về null, tuy nhiên, xem xét khung là ổn định về thay đổi mã, tôi sẽ có xu hướng đưa ra quyết định sáng suốt bằng cách xem tài sản hoặc phương pháp bạn gọi điện thoại hoạt động bằng cách sử dụng ILSpy hoặc JustDecompile.

Trong ví dụ của bạn, có vẻ như không thể trả lại null do hàm tạo cho ImageFormat chấp nhận Guid và gán nó vào trường riêng tư.

Tùy thuộc vào những gì bạn đang làm với tài sản có thể là giá trị kiểm tra:

  1. Đó là một StatusException không ném vào truy cập thuộc tính.
  2. Điều đó ImageFormat bằng định dạng bạn mong đợi vì nó có thể đại diện cho định dạng hình ảnh mà không GdiPlus hoặc .NET là "nhận thức" của.