为什么属性中需要大括号

本文关键字:属性 为什么 | 更新日期: 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对这个问题的完整回答,指向描述这个问题的语言规范的确切位置,可以查看:

为什么会出现编译错误