C#短空检查语法
本文关键字:语法 检查 | 更新日期: 2023-09-27 18:25:40
我最近在两个Objective C中都进行了大量编码,同时还参与了几个C#项目。在这个过程中,我发现我错过了两个方向的东西。
特别是,当我在C#中编码时,我发现我错过了Objective C.的短空检查语法
为什么你认为在C#中,你不能用如下语法检查对象是否为null:
if (maybeNullObject) // works in Objective C, but not C# :(
{
...
}
我同意if (maybeNullObject != null)
是一种更详细/更清晰的语法,但一直在代码中编写它不仅感觉很乏味,而且感觉过于冗长。此外,我相信if (maybeNullObject)
语法通常被大多数开发人员所理解(Javascript、Obj C,我认为还有其他语法)。
我把这个问题当作一个问题来抛出,假设C#不允许if (maybeNullObject)
语法可能有特定的原因。然而,我认为编译器可以很容易地将对象表达式(如if (maybeNullObject)
)自动(或自动)转换为if (maybeNullObject != null)
。
这个问题的重要参考是一个想法如何成为C#语言的特性?。
编辑
我建议的短空检查语法只适用于对象。短null检查将不适用于基元和bool?
之类的类型。
if
语句是严格的。它们只接受布尔值,不接受其他值,并且没有后续级别的"真实性"(即0、null等。它们是自己的动物,不存在隐式转换)。
编译器可以"轻松地将"几乎任何表达式转换为布尔值,但这可能会导致微妙的问题(相信我…),并且有意识地决定不允许这些隐式转换。
IMO这是一个不错的选择。您本质上是在要求一次性的隐式转换,编译器假设,如果表达式没有返回布尔结果,那么程序员一定想执行null检查。除了是一个非常狭窄的特征外,它纯粹是句法上的糖,几乎没有提供明显的好处。正如Eric Lippert所说,每一项功能都有成本。。。
你要求的功能会给语言增加不必要的复杂性(是的,它很复杂,因为类型可能定义了到布尔的隐式转换。如果是这样,则执行哪个检查?)只是为了让你不偶尔键入!= 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!" );
}
}
一个潜在的冲突是与定义到bool
的隐式转换的引用对象发生冲突。
编译器在if(myObject)
检查null
和检查true
之间没有划分。
目的是不留下歧义。你可能会觉得这很乏味,但多年来,这种短兵相接的做法导致了许多错误。C#正确地有一个布尔值的类型,而不让0的值为false和任何其他值为true是出于良心的决定。
您可以针对System.Object编写一个扩展方法,也许名为IsNull()?
当然,在为扩展类编写代码的基础上,还需要额外的8或9个字符。我认为大多数人都对显式null测试带来的清晰性感到满意。