【问题标题】:Why do I need braces in a property为什么我需要在属性中使用大括号
【发布时间】:2013-06-12 09:44:43
【问题描述】:

我有这个属性

    /// <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() 那样实现 (),例如

【问题讨论】:

  • 类和方法也需要大括号,try/catch/finally 和其他一些结构也是如此。这些事情背后通常没有什么理由(并且正确地遵循编码约定无论如何都会使这些特质成为一个有争议的问题)。

标签: c# properties get set curly-braces


【解决方案1】:

这些括号不是作用域块,它是语法的一部分。 setter 和 getter 实际上是方法,所以它的语法类似于函数。

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

if (<condition>) <statement>

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

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

就像函数一样:

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

【讨论】:

    【解决方案2】:

    因为 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# 编译器团队的工作量太大,要实现一些对单行属性来说只是一个不错的东西。

    【讨论】:

    • Where does the getter end and where does the setter begin? 因为它在一条线上,我看不出有什么问题。
    【解决方案3】:

    这只是一种语言设计,是这样考虑的。这就像关于兰博基尼汽车的门是向上打开而不是像其他汽车那样侧向打开的事实。一切都与语言设计有关。

    有关此问题的完整 Jon Skeet 答案,指向描述此问题的语言规范的确切位置,可以查看:

    Why this compile error

    【讨论】:

    • 对我来说,它看起来更像是一辆兰博基尼汽车的实现(以你的例子为例),一扇向上打开的门,一扇侧向打开的门。
    • @MikedeKlerk:不,不是,请查看提供的链接。
    猜你喜欢
    • 1970-01-01
    • 2013-05-05
    • 2012-09-03
    • 2019-11-04
    • 2014-08-09
    • 2017-11-07
    • 2014-02-10
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多