C#short null check语法

时间:2012-02-24 23:01:52

标签: c# language-design

我最近在Objective C中编写了大量代码,同时还在几个C#项目上工作。在这个过程中,我发现我错过了双向的事情。

特别是,当我在C#中编码时,我发现我错过了Objective C的短空检查语法。

为什么你认为在C#中你不能用以下语法检查对象是否为空

if (maybeNullObject)  // works in Objective C, but not C#   :(
{
   ...
}

我同意if (maybeNullObject != null)是一种更详细/更清晰的语法,但在代码中始终编写不仅乏味,而且过于冗长。另外,我相信大多数开发人员通常都会理解if (maybeNullObject)语法(Javascript,Obj C,我假设其他人)。

我把它作为一个问题抛出,假设C#不允许使用if (maybeNullObject)语法的具体原因。但我认为编译器可以轻松地将对象表达式(例如if (maybeNullObject))自动(或automagically)转换为if (maybeNullObject != null)

对这个问题的好评是How an idea becomes a C# language feature?

修改

我建议的短空检查语法只适用于对象。短空检查不适用于bool?等基元和类型。

4 个答案:

答案 0 :(得分:9)

因为C#中的if语句是严格的。它们只取布尔值,没有别的,并且没有后续级别的“真实性”(即0,null,无论如何。它们是它们自己的动物,并且它们不存在隐式转换)。

编译器可以“轻松地”将几乎任何表达式“转换”为布尔值,但这会导致细微的问题(相信我......)并且有意识地决定不允许这些隐式转换。

IMO这是一个不错的选择。您基本上要求一次性隐式转换,其中编译器假定,如果表达式未返回布尔结果,则程序员必须要执行空检查。除了是一个非常狭窄的特征,它纯粹是语法糖,提供很少甚至没有明显的好处。正如Eric Lippert所说,每个功能都有成本......

您要求的功能会为语言增加不必要的复杂性(是的,它很复杂,因为类型可能会定义一个隐式转换为bool。如果是这种情况,执行哪个检查?)只允许您不要偶尔输入!= null

编辑:

如何为@Sam定义隐式转换为bool的示例(评论时间过长)。

class Foo
{
    public int SomeVar;
    public Foo( int i )
    {
        SomeVar = i;
    }

    public static implicit operator bool( Foo f )
    {
        return f.SomeVar != 0;
    }
}

static void Main()
{
    var f = new Foo(1);         
    if( f )
    {
        Console.Write( "It worked!" );
    }
}

答案 1 :(得分:4)

一个潜在的碰撞是参考对象,它定义了对bool的隐式转换。

if(myObject)检查null或检查true之间没有对编译器进行描述。

答案 2 :(得分:1)

意图不留任何含糊之处。您可能会觉得这很乏味,但多年来这个短手是造成许多错误的原因。 C#正确地有一个类型的布尔值,并且出于良心的决定,不要使0表示假,而任何其他值都是真的。

答案 3 :(得分:1)

您可以针对System.Object编写扩展方法,也许称为IsNull()?

当然,除了你必须为扩展类编写的代码之外,还有8或9个字符。我认为大多数人都对明确的空测试带来的清晰度感到满意。