2012-02-28 35 views
7

Tôi có nhiều thực thể có thuộc tính IsActive. Vì lý do nội bộ, tôi cần tất cả các trường đó đều có thể vô hiệu. Mặt khác, đối với mỗi thực thể tôi có thể phải làm một bài kiểm tra đôi trong hàng chục nơi trong ứng dụng:Tránh kiểm tra nhiều lần cho các giá trị rỗng trên cùng một thuộc tính

(null được coi là đúng)

if (language.IsActive == null || language.IsActive.value) 

Nếu tôi tạo ra một phương pháp như

class Language 
{ 
    public bool IsActiveLanguage() 
    { 
     return language.IsActive == null || language.IsActive.value; 
    } 
} 

Nó vẫn sẽ không ẩn thuộc tính (ít nhất là từ bên trong lớp) để dễ bị lỗi.

Tôi đã cố gắng tìm cách ghi đè, nhưng tất nhiên tôi không thể thay đổi loại trả về thành đơn giản bool.

Bạn sẽ làm gì để tránh sự thừa trong trường hợp này?

+5

Vì vậy, trong trường hợp của bạn null tương đương với * true *, không phải là false? Điều đó hơi khác thường. –

+0

Vâng, đó là loại "miễn là nó không sai, đó là sự thật". Tôi đồng ý rằng đây có lẽ không phải là phương pháp hay nhất! – Mathieu

Trả lời

13

Sử dụng phương pháp GetValueOrDefault, xác định giá trị được sử dụng ở vị trí của null:

public bool IsActiveLanguage() 
{ 
    return language.IsActive.GetValueOrDefault(true); 
} 

LƯU Ý:

Có sử dụng phương pháp CLR hay không (GetValueOrDefault) hoặc la toán tử ngôn ngữ (?? trong C#, If(,) trong VB) không có sự khác biệt với kết quả, nó chỉ là một câu hỏi về tính nhất quán mã. Cá nhân, tôi sử dụng toán tử ngôn ngữ ở những nơi mà tôi muốn xử lý các kiểu giá trị null và chuỗi theo cùng một cách, nhưng phương thức CLR ở những nơi tôi muốn nhấn mạnh chính xác những gì đang xảy ra với giá trị nullable.

1

Tại sao bạn không chỉ che giấu chi tiết thi hành này trong getter:

private bool? _IsActive; 
public bool IsActive { get { return !_IsActive.HasValue ||_IsActive; } } 

EDIT: Sau khi nhận ra các tính chất được tạo ra và không thể được sửa đổi

Bạn có thể khai báo một kiểu mới, gọi ThreeValBool, mà bản chất là một bool ?, và thêm một diễn viên tiềm ẩn từ nó đến bool, như vậy:

struct ThreeValBool 
{ 
    private bool? _value; 

    public static implicit operator bool(ThreeValBool tvb) 
    { 
     return !tvb._value.HasValue || tvb.value; 
    } 
} 

Rõ ràng bạn cần phải thêm một cách để thiết lập giá trị ...

Làm cho thuộc tính của bạn thuộc loại đó (hy vọng nhà thiết kế sẽ cho phép bạn làm điều đó).

+0

Vì việc triển khai nằm trong tệp .designer.cs. Nếu không thì, đây sẽ là một giải pháp tốt! – Mathieu

+0

Vâng, bạn có thể tạo thuộc tính IsActive được tạo riêng tư không? Nếu có, bạn có thể thêm thuộc tính IsReallyActive của bạn làm như vậy. – zmbq

+0

Có vẻ hơi cồng kềnh để có được điều này trên tất cả các nơi. Nếu đây là tuyến đường, tôi sẽ cung cấp cho AOP một shot để làm cho nó ngắn hơn một chút. Đặt một thuộc tính trên IsActive để ghi đè giá trị trả về. Cũng cho khả năng tái sử dụng nó trên booleans lạ khác. –

3

Nếu tài sản của bạn là Nullable<> và một giá trị null nghĩa true, bạn có thể sử dụng thay vì một kiểm tra null rõ ràng:

language.IsActive.GetValueOrDefault(true); 
2

câu trả lời tốt được đưa ra, tôi sẽ có thể làm một

public static bool IsActive(bool? toCheck) 
{ 
    return toCheck.GetValueOrDefault(true); 
} 

trên một số lớp trợ giúp tĩnh.

Các vấn đề liên quan