为什么属性中需要大括号
本文关键字:属性 为什么 | 更新日期: 2023-09-27 18:18:13
我有这个属性
/// <summary>
/// The production date of the device is contained in its serial number.
/// </summary>
public DateTime Date
{
get
{
return SerialNumber.Date;
}
}
但是,我希望我可以这样写
/// <summary>
/// The production date of the device is contained in its serial number.
/// </summary>
public DateTime Date
{
get return SerialNumber.Date;
}
但我收到错误{ or ; expected
.
现在我的问题是:为什么这里需要大括号,而我不希望标记作用域的开始和结束,因为只有一行代码。
我是否需要使用大括号并不重要。但在我看来,它与c#代码的其他解释不一致。
你可以使用例如if(DoNotUseBraces) return null;
,不需要大括号。甚至
if (SomeBoolean)
return null;
同样,不需要大括号。我猜它和:为什么只有一条语句的方法需要大括号?但是get不像get()
那样实现(),例如
这些括号不是用于作用域块的,它是语法的一部分。setter和getter实际上是方法,因此与函数的语法类似。
对于if
语句,括号不是语法的一部分:
if (<condition>) <statement>
对于属性getter,括号是语法的一部分:
<type> <identifier> { get { <statements> } }
和函数一样:
<type> <identifier>(<parameters>) { <statements> }
因为c#中的属性也可以有setter:
public DateTime Date
{
get return SerialNumber.Date;
set SerialNumber.Date = value;
}
这行不通。getter在哪里结束,setter在哪里开始?
这些作用域是清晰的,即使你添加了多行:
public DateTime Date
{
get { return SerialNumber.Date; }
set { SerialNumber.Date = value; }
}
现在我的问题是:为什么我在这里需要大括号,而我不希望标记作用域的开始和结束,因为只有一行代码。
我想对于c#编译器团队来说,实现一个仅仅是一行属性的好东西是太多的工作了。
这只是一种语言设计,是这样考虑的。这就像担心兰博基尼的车门是向外打开的,而不是像其他车那样向侧面打开。这都是关于语言设计的。
有关Jon Skeet对这个问题的完整回答,指向描述这个问题的语言规范的确切位置,可以查看:
为什么会出现编译错误