为什么我需要在属性中使用大括号

时间:2013-06-12 09:44:44

标签: c# properties get set curly-braces

我有这个属性

    /// <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;

同样,没有必要的支撑。我想它与Why do methods with only one statement need braces?相同,但是get没有实现像get()这样的()。

3 个答案:

答案 0 :(得分:3)

因为C#中的属性也可以有一个setter:

public DateTime Date
{
    get return SerialNumber.Date;
    set SerialNumber.Date = value;
}

那不行。吸气器在哪里结束,接线器从哪里开始?

即使您添加多行,这些范围也很明确:

public DateTime Date
{
    get { return SerialNumber.Date; }
    set { SerialNumber.Date = value; }
}
  

现在我的问题是:为什么我需要括号,而我却不想   标记范围的开头和结尾,因为只有一行   代码。

我认为,对于C#编译器团队而言,实现对于单个内部属性来说只是一个很好的东西是太多的工作。

答案 1 :(得分:3)

这些括号不适用于范围块,它是语法的一部分。 setter和getter实际上是方法,因此它类似于函数的语法。

对于if语句,括号不是语法的一部分:

if (<condition>) <statement>

对于属性getter,括号是语法的一部分:

<type> <identifier> { get { <statements> } }

就像它们的功能一样:

<type> <identifier>(<parameters>) { <statements> }

答案 2 :(得分:1)

这只是一种语言设计,就是这样考虑的。这就像兰博基尼汽车的车门向上敞开而不是像其他车一样敞开的事实。这完全是语言设计。

关于这个问题的完整Jon Skeet答案,指出描述这个问题的语言规范的确切位置,可以看看:

Why this compile error