Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#短空检查语法_C#_Language Design - Fatal编程技术网

C#短空检查语法

C#短空检查语法,c#,language-design,C#,Language Design,我最近一直在用Objective C编写大量代码,同时还参与了几个C#项目。在这个过程中,我发现我错过了两个方向的东西 特别是,当我用C语言编写代码时,我发现我错过了Objective C的简短空检查语法 为什么你认为在C语言中,你不能用如下语法检查对象的空值: if (maybeNullObject) // works in Objective C, but not C# :( { ... } 我同意if(maybeNullObject!=null)是一种更为详细/清晰的语法,但

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

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

为什么你认为在C语言中,你不能用如下语法检查对象的空值:

if (maybeNullObject)  // works in Objective C, but not C#   :(
{
   ...
}
我同意
if(maybeNullObject!=null)
是一种更为详细/清晰的语法,但它不仅让人感觉总是用代码写出来很无聊,而且感觉太冗长了。此外,我相信大多数开发人员都能理解
if(maybeNullObject)
语法(Javascript、objc和我假设的其他语法)

我将此作为一个问题抛出,假设C#不允许使用
if(maybeNullObject)
语法可能有特定的原因。然而,我认为编译器可以轻松地将对象表达式(如
if(maybeNullObject)
自动(或)转换为
if(maybeNullObject!=null)

这个问题的重要参考是

编辑
我建议的简短空检查语法只适用于对象。短空检查不适用于原语和类型,如
bool?

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

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

在我看来,这是一个不错的选择。实际上,您要求进行一次性隐式转换,其中编译器假定,如果表达式不返回布尔结果,那么程序员一定希望执行空检查。除了是一个非常狭隘的特性之外,它纯粹是语法上的糖分,提供的好处很少甚至没有。正如Eric Lippert所说,每个功能都有成本

您要求的功能会给语言增加不必要的复杂性(是的,它是复杂的,因为类型可能会定义到bool的隐式转换。如果是这种情况,将执行哪项检查?)只允许您不键入
!=空值
偶尔出现一次

编辑:

如何为@Sam定义到
bool
的隐式转换的示例(注释太长)


一个潜在冲突是与定义到
bool
的隐式转换的引用对象的冲突


编译器在检查
if(myObject)
是否为
null
或检查
true

的意图之间没有定义。你可能会觉得这很乏味,但这种速记多年来造成了许多错误。C#正确地有一个布尔类型,out是一个良心决定,不使0 mean false和任何其他值true。

您可以针对System.Object编写一个扩展方法,可能称为IsNull()


当然,在您必须为扩展类编写的代码之外,还需要额外的8或9个字符。我认为大多数人都对显式空测试带来的清晰性感到高兴。

虽然我同意这是一个“好的选择”(我更喜欢静态类型语言),但它不是“唯一的[正确的]选择”。这一切都归结于一种语言如何定义它的“虚假价值”;C(和Objective-C)没有适当的“false”,只有0(或Objective-C上的
nil
)和非0概念;-)同意。我不确定额外的8个字符(包括空格)是否过于冗长,但我很欣赏这些字符在扫描代码时所带来的清晰度。@pst:大多数设计选择都是如此。几乎总是有多种选择,但必须做出一种选择。@pst是的,在C语言中这个决定就是为什么射中自己的脚如此容易的原因。我认为C的决定是错误的。@EdS。你能举个例子说明类型如何定义到bool的隐式转换吗?这是否意味着如果
myObj
的类定义隐式转换为bool,则可以使用类似
if(myObj)
的表达式(不用于空检查)?如果存在对bool的隐式转换,我不得不同意您的观点,即抛出null检查将非常混乱。此外,我同意更明确的代码意图更清晰,这个特性请求当然是语法上的甜点。我只是想念它。:)没关系,.NET真的很棒。这与其说是一个回答,不如说是一个诙谐的评论:在某些情况下,你可以通过使用空对象模式来绕过空值检查。@Sam更大的问题(十亿美元的错误)是:为什么这两种语言中都有空值?:-)这是一个C#可以解决但没有解决的问题:(是的,这个问题已经被问过(而且可能已经结束了)至少几次了。对于可为null的bool值这一简单事实,我更喜欢更严格的语法,我想你最近没有遇到过。编写它不是很难!=null你曾经错误地编写过
if吗(foo=bar)
而不是
if(foo==bar)
?因为
if
只在C#中的
bool
s上工作,前者不编译(除了
foo
bool
)。@svick谢天谢地,现代C编译器有这些小东西叫做“警告”:
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!" );
    }
}