我最近在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?
等基元和类型。
答案 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个字符。我认为大多数人都对明确的空测试带来的清晰度感到满意。