今天在审查公关时,我在课堂上看到了这一点:
public bool ?Selected { get; set; } //question mark in front of property name
我怀疑开发人员意味着这个
public bool? Selected { get; set; } //question mark at end of type
我很惊讶这甚至都遵守了,所以我自己尝试了,发现这是合法的代码,它最终会做同样的事情。
我的问题是:这两者之间是否存在任何微妙(或不那么微妙)的区别?
答案 0 :(得分:3)
首先,我的Visual Studio 2017会立即纠正此
public bool ?Selected { get; set; }
到此
public bool? Selected { get; set; }
然后,IL DASM来救援!您可以看到生成的IL是相同的,就像@mjwills在评论中所说的那样:
最后,你总是可以点击 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。