【问题标题】:What is the difference between bool? MyProperty and bool ?MyPropertybool 和有什么不一样? MyProperty 和 bool ?MyProperty
【发布时间】:2018-08-29 19:33:32
【问题描述】:

今天在查看 PR 时,我在课堂上看到了这个:

public bool ?Selected { get; set; }   //question mark in front of property name

我怀疑开发者是这个意思

public bool? Selected { get; set; }  //question mark at end of type

我很惊讶这竟然符合要求,所以我自己尝试了一下,发现这是合法代码,它最终会做同样的事情。

我的问题是:这两者之间有什么微妙(或不那么微妙)的区别吗?

【问题讨论】:

  • 它们是一样的。
  • 一个真的很丑
  • 这就像 c++ 中的 int* a 和 int *a
  • 感谢 cmets。我要让他们将其更改为更常见的布尔值吗?使其与其余代码一致。这让我措手不及!
  • @sTrenat,c++ 可能更具误导性。 int? a, b在c#中声明了2个可以为空的int,int* a, b(或int *a, b)声明了一个指针和一个整数

标签: c#


【解决方案1】:

首先,我的 Visual Studio 2017 立即纠正了这个问题

public bool ?Selected { get; set; } 

到这里

public bool? Selected { get; set; } 

那么,IL DASM 来救援!你可以看到生成的 IL 是一样的,就像 @mjwills 在 cmets 中所说的:

最后,你总是可以按 Ctrl+K + Ctrl+D 让 Visual Studio 重新格式化您的代码并正确管理空格和缩进。

根据您关于将bool? 更改为bool 的问题,这取决于:如果某物可以有indefinite value or state,就像checkboxes,您应该使用bool?;否则bool 很好。

【讨论】:

  • 我会投赞成票只是因为你做了所有这些研究。
  • 感谢您的工作,澄清一下,我的问题不是关于更改 bool 吗?布尔值。这只是关于问号的位置。
【解决方案2】:

当您意识到以下内容也有效时,这可能会更有意义:

public bool?Selected { get; set; } 

? 在该上下文中是可空类型标识符,因此它后面不能跟任何在当前标记中有意义的字符,因此词法分析器只需处理可空类型标识符并开始对以下预期进行词法分析令牌。真正多余的是空格,它更像是一种格式帮助,使其比语法要求更具可读性。

在许多情况下,空格是编译器可以不用的毫无意义的琐事。

它在某种意义上类似于为什么以下都是有效的:

static bool Huh<T >() { return false; }
static bool Huh<T > () { return false; }
static bool Huh <T > () { return false; }
etc.

【讨论】:

    【解决方案3】:

    正如其他人所建议的那样,代码如何根据 ? 的位置运行没有区别。假设编译器可以识别运算符和操作数,则编译器不太关心空格。它只是归结为可读性和个人/团队偏好。

    例如,给定:

    var app = new App();
    

    这些也是一样的:

    app.      SomeMethod();
    

    还有

    app      .SomeMethod(); 
    

    app   .   SomeMethod();
    

    或者将点运算符放在中间的任何其他位置;包括在新线上。所有这些都编译为相同的 IL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 2016-04-19
      • 1970-01-01
      • 2011-10-05
      • 2018-08-07
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多