我最近一直在使用 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/