C# 有没有更干净的方法来检查对象是否为假?

C# 有没有更干净的方法来检查对象是否为假?,c#,syntax,C#,Syntax,有没有更干净的方法来写这个 if (!(obj is bool) || (bool)obj) 在PHP或JS中,您可以编写 if (obj !== false) // note the double == to indicate a type-check 它只是有点难读,而且在C#中语法上很难看 绝对清楚地说,obj是一个对象 if (!false.Equals(obj)) { ... } 编辑:因为我不想@BoltClock失去视力,这里有一些可能更好的方法: if ((bool?)

有没有更干净的方法来写这个

if (!(obj is bool) || (bool)obj)
在PHP或JS中,您可以编写

if (obj !== false) // note the double == to indicate a type-check
它只是有点难读,而且在C#中语法上很难看


绝对清楚地说,
obj
是一个
对象

if (!false.Equals(obj))  { ... }
编辑:因为我不想@BoltClock失去视力,这里有一些可能更好的方法:

if ((bool?)obj != false) { ... }


编辑2:不要尝试我上面提到的内容,因为如果
obj
的类型不是
bool?
bool
,是的,有。更改代码,使obj的类型为
bool
,而不是
object

if (!false.Equals(obj))  { ... }
在代码的某个地方,您将布尔值转换为对象。你为什么这么做?找到那个地方,把它当作一个废物


这是C#,而不是PHP或JS。C#是强类型的——利用这个事实

试试这个,它很容易阅读,有时代码需要易懂

if (obj.Equals(false))

聪明,尽管我现在必须设法阻止我的眼睛流血,看
!false
,这样他们就可以看到附加到
false
:)的
.Equals(obj)
。@BoltClock:噢,对不起。。。也许会有帮助虽然这在语法上是正确的,但它远非惯用语。我们应该鼓励@Mark写一些我们其他人很容易理解的东西。@Mehrdad:我认为
如果((bool?)obj)
有效,你就需要
!=错误
。与此相关的是,我曾经写过这篇文章只是为了好玩:
if(!((bool?)obj??false))//如果它是null或false
@rockthesixstring:Is
!false
真的那么糟糕吗?我对它没有问题,但是你可以总是放一个空格,比如
!false
,更清楚地表明你的眼睛是否在流血……你的意思不是“检查一个物体是否为假”或“检查一个物体是否为真”,是吗?@BoltClock:对不起,是的。我的意思是“检查对象是否为false”,为什么需要使正确的一行“更干净?”添加一两行注释,解释为什么必须执行显式类型检查。如果你发现它很麻烦,因为你到处重复,那么你就是违反了DRY。@Kennet:有几个原因。到目前为止,它只发生在一个地方,所以是的,这是一个单一的班轮。如果这个问题没有任何“好”的答案,我绝对会将检查封装到它自己的函数中,但是因为我问了,我发现为什么是的,有一个非常好的解决方案(thx Mehrdad)是如此简洁易读,以至于它实际上不需要封装。此外,我要求学习,而不是解决一个非常具体的问题。这里我想检查一个对象是否为假,但这里的解决方案很容易适用于任何我有一个对象并想检查它的场景——对照特定的类型和值。此外,我希望我所有的代码都是干净的,即使是只出现一次的代码。迟早,我会重新阅读它,或者在另一个项目中再次使用它。。。或者别的什么。也许我是个坏人,但我不喜欢评论。我更喜欢可读代码。真的吗?做OP要求的事情有很多合理的理由。+1-如果你像在PHP或JavaScript中一样,在C中以
对象
的形式传递所有东西,那么语法当然会很难看!是的,如果您只使用自己编写的代码,那么不要将其作为
对象传递。但在使用外部库或数据表时,并非所有内容都是强类型的。。。。我很想投你一票。我特别使用了一个对象,因为它可以是任何东西。我正在编写语法,并存储键/值对,其中的值可以是任何类型。如果我能更严格些,我会更严格。@Kragen:这里也不能使用泛型。它不是默默地返回错误,它只是做了一些不同的事情。布尔和
null
是特殊情况,其他所有内容都被转换为字符串。。。我真的不想在这里谈得太深入。是的,这是这个问题的目的,但正如Mehrdad和我在他问题下面的评论中所讨论的,如果a)
obj
null
(在我的情况下这是有效的),或者b)
obj
覆盖
Equals
做一些愚蠢的事情(不太可能但值得注意),这是有问题的