我有很多具有IsActive
属性的实体。出于内部原因,我需要所有这些字段都可以为空。另一方面,对于每个实体,我可能需要在应用程序中的数十个位置进行双重测试:
(null被视为true)
if (language.IsActive == null || language.IsActive.value)
如果我创建一个类似
的方法class Language
{
public bool IsActiveLanguage()
{
return language.IsActive == null || language.IsActive.value;
}
}
它仍然不会隐藏属性(至少在类内部),因此容易出错。
我试图找到一种覆盖方法,但当然我无法将返回类型更改为普通bool
。
在这种情况下,您会采取什么措施来避免冗余?
答案 0 :(得分:16)
您可以使用the null-coalescing operator,因此您的示例将变为:
return language.IsActive ?? true;
答案 1 :(得分:13)
使用GetValueOrDefault
方法,指定要用于代替null
的值:
public bool IsActiveLanguage()
{
return language.IsActive.GetValueOrDefault(true);
}
注意:强>
是否在C#中使用CLR方法(GetValueOrDefault
)或语言运算符(??
,在VB中使用If(,)
)对结果没有影响,它只是代码问题一致性。就个人而言,我使用语言运算符在我想要以相同方式处理可空值的类型和字符串的地方,但CLR方法在我想要强调可以为空的值发生的地方。
答案 2 :(得分:3)
如果您的媒体资源为Nullable<>
且null
值表示true
,则您可以使用此资源代替显式空检查:
language.IsActive.GetValueOrDefault(true);
答案 3 :(得分:2)
给出了很好的答案,我可能会做一个
public static bool IsActive(bool? toCheck)
{
return toCheck.GetValueOrDefault(true);
}
在一些静态助手类上。
答案 4 :(得分:1)
为什么不在getter中隐藏这个实现细节:
private bool? _IsActive;
public bool IsActive { get { return !_IsActive.HasValue ||_IsActive; } }
编辑:实现属性生成后无法修改
你可以声明一个名为ThreeValBool的新类型,它本质上是一个bool ?,并将一个隐式转换添加到bool中,如下所示:
struct ThreeValBool
{
private bool? _value;
public static implicit operator bool(ThreeValBool tvb)
{
return !tvb._value.HasValue || tvb.value;
}
}
显然你需要添加一种设置值的方法......
制作该类型的属性(希望设计师能让你这样做)。