bool有什么区别? MyProperty和bool?MyProperty

时间:2018-03-20 20:23:17

标签: c#

今天在审查公关时,我在课堂上看到了这一点:

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

我怀疑开发人员意味着这个

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

我很惊讶这甚至都遵守了,所以我自己尝试了,发现这是合法的代码,它最终会做同样的事情。

我的问题是:这两者之间是否存在任何微妙(或不那么微妙)的区别?

3 个答案:

答案 0 :(得分:3)

首先,我的Visual Studio 2017会立即纠正此

public bool ?Selected { get; set; } 

到此

public bool? Selected { get; set; } 

然后,IL DASM来救援!您可以看到生成的IL是相同的,就像@mjwills在评论中所说的那样:

enter image description here

enter image description here

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

根据您关于将bool?更改为bool的问题,这取决于:如果某些内容可以indefinite value or state,就像checkboxes一样,则应使用bool? };否则bool没问题。

答案 1 :(得分:1)

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

public bool?Selected { get; set; } 
该上下文中的

?是可空类型标识符,因此它不能跟随当前令牌中有意义的任何字符,因此词法分析器只处理可空类型标识符并启动lexing以下预期令牌。真正多余的是空白,它更像是一种格式助手,使其比语法要求更具可读性。

在许多情况下,空格在编译器无法实现的无意义的琐事中。

在某种意义上它的相似之处在于以下各项都是有效的:

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

答案 2 :(得分:0)

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

例如,给定:

var app = new App();

这些也是一样的:

app.      SomeMethod();

并且

app      .SomeMethod(); 

app   .   SomeMethod();

或者将点运算符置于其他任何位置;包括在一条新线上。这一切都归结为同一个IL。