"bool?MyProperty"和"bool MyProperty"之间有什么区别?

6
今天在审查一个PR时,我看到了这样一段代码:

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

我猜测开发者的意思是这样的:

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

我很惊讶这段代码居然通过了,因此我自己尝试了一下,发现这是合法的代码,并且最终实现了相同的功能。

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


1
它们是一样的。 - mjwills
9
一个人真的很丑。 - James Parsons
2
这就像C++中的int* a和int *a。 - sTrenat
2
感谢您的评论。我将让他们将其更改为更常见的bool?,以便与代码的其余部分保持一致。这让我措手不及! - HitLikeAHammer
2
@sTrenat,C++ 可能更加容易引起误解。在 C# 中,int? a, b 声明了两个可空的整型变量,而 int* a, b(或者 int *a, b)则声明了一个指针和一个整型变量。 - Gian Paolo
显示剩余3条评论
3个回答

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的问题,取决于情况:如果某些东西可以具有未定值或状态,就像复选框一样,您应该使用bool?;否则,bool就可以了。

1
我会点赞的,因为你做了这么多的研究。 - David Lebee
谢谢你的工作,不过为了澄清,我的问题并不是关于将 bool? 改为 bool。它只涉及到问号的放置位置。 - HitLikeAHammer

1
当你意识到以下内容也是有效的时,它可能会更有意义:
public bool?Selected { get; set; } 

在这个上下文中,“?”是可为空类型标识符,因此它后面不能跟任何在当前令牌中有意义的字符,因此词法分析器仅处理可为空类型标识符并开始词法分析以下预期的令牌。真正多余的是空格,它更像是一个格式助手,使其更易读,而不是语法要求。
在许多情况下,空格是无意义的琐事,编译器可以不使用。
从某种意义上说,这类似于为什么以下内容都是有效的:
static bool Huh<T >() { return false; }
static bool Huh<T > () { return false; }
static bool Huh <T > () { return false; }
etc.

0
正如其他人所建议的那样,代码的功能不会因为?的位置而有所不同。编译器并不太关心空格,只要它能理解运算符和操作数即可。这只是与可读性和个人/团队偏好有关。
例如,给定:
var app = new App();

这些也是一样的:

app.      SomeMethod();

而且

app      .SomeMethod(); 

而且

app   .   SomeMethod();

或者将点运算符放在其他任何位置,包括在新行上。它们都会编译成相同的IL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接