C# 简短空检查语法

标签 c# language-design

我最近一直在使用 Objective C 编写大量代码,同时还在处理几个 C# 项目。在这个过程中,我发现我错过了两个方向的东西。

特别是,当我用 C# 编写代码时,我发现我错过了 Objective C 的简短 null 检查语法。

为什么您认为在 C# 中您不能使用如下语法检查对象是否为 null:

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? .

编辑

我建议的简短 null 检查语法仅适用于对象。简短的 null 检查不适用于原语和类型,例如 bool?

最佳答案

因为 C# 中的 if 语句是严格的。它们只采用 bool 值,没有别的,并且没有后续级别的“真实性”(即 0,null,等等。它们是它们自己的动物,不存在对它们的隐式转换)。

编译器可以“轻松地将几乎任何表达式转换”为 bool 值,但这可能会导致微妙的问题(相信我……),因此有意识地决定禁止这些隐式转换。

IMO 这是一个不错的选择。您实质上是在要求一次性隐式转换,其中编译器假设,如果表达式不返回 bool 结果,那么程序员一定想要执行空检查。除了是一个非常狭窄的功能之外,它纯粹是语法糖,几乎没有提供明显的好处。正如 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!" );
    }
}

关于C# 简短空检查语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439269/

相关文章:

python - 为什么 Python 没有符号函数?

operators - 现代语言支持 += 但不支持 &&=

java - 为什么 Java 中需要无符号类型?

c# - 查找屏幕分辨率会导致线程问题

java - 委托(delegate)帮助 java 到 c#

c# - Web API 系统内存不足异常

c# - 如何从第一项之外的 foreach 枚举

c# - 重定向基于用户对象属性的自定义属性 (asp.net mvc)

javascript - 为什么不能在闭包的私有(private)函数中直接访问 this 的属性?

objective-c - 闲聊和 ObjectiveC 中的消息传递是否与参数中具有值类型(结构)的调用方法相同?