为什么在setter之前定义getter(编码约定)

本文关键字:编码 约定 getter 定义 setter 为什么 | 更新日期: 2023-09-27 18:30:01

我很感激这个问题有点傻,所以如果这是离题或没有建设性的,我提前道歉。

为什么在C#中,在setter之前用getter定义属性是标准约定*?对于同时具有这两者的属性,您几乎总是在getter之前使用setter,因此它处于有效状态。因此,在我看来,我们首先定义getter似乎有点落后。

此外,setter通常会有一些getter不需要的验证逻辑。把这个逻辑放在getter之前,让它更清楚地表明属性应该如何表现,这不是更整洁吗。例如:

public decimal Price
{
    get { return _price; }
    set
    {
        if(value < 0m)
        {
            throw new ArgumentOutOfRangeException();
        }
        _price = value;
        OnPropertyChanged("Price");
    }
}

setter中的代码远比getter有趣,它不应该优先定义吗?

*我知道这些东西没有规则,但实际上每一个属性的例子都在setter之前定义getter。

为什么在setter之前定义getter(编码约定)

因为给予总比接受好。

更严重的是,我猜是因为写代码片段的人(或者是在VS中自动生成属性代码的人)下意识地选择了这个顺序。

然后,由于我们其他人对这位开拓性的牧羊人来说只是绵羊,我们毫无疑问地跟随了他。

直到你。

你质疑我们曾经伟大的牧羊人,无政府状态只会随之而来。提交你的代码,然后奔向山丘。

getter通常要短得多(通常是一行),所以把它放在开头可以让你更好地概述,就像你更喜欢这样:

if (condition)
{
    // Short code
}
else
{
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
}

而不是这个:

if (!condition)
{
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
    // Long code
}
else
{
    // Short code
}

不仅仅是因为。

getter和setter的顺序完全不一致,我认为约定的原因是Visual Studio的属性片段以这种方式生成了属性(getter先于setter)。因此,在使用了几次这个片段后,对于大多数程序员(包括我自己)来说,这个顺序已经成为一种不成文、不合理的做法。当然,这并不能解释VS设计者为什么要以这种方式实现代码片段。我的观点是:他们不知道,也不在乎,或者可能是因为g在英语字母表中比s来得早。不管怎样,世界上谁有这么多时间在乎?

我认为这里最重要的是一致性。虽然在你的例子中,setter"更有趣",但我不认为大多数时候都是这样。事实上,auto属性如此有用的原因之一是,get和set代码只需从私有字段中读取/写入私有字段而不进行其他处理的频率很高,在这种情况下,两者都"不那么有趣"。

在你自己的项目中,你当然可以自由地将它们按你喜欢的任何顺序排列,如果你基于"重要性"或其他原因决定setter应该排在第一位,你完全可以这样做。然而,考虑到getter-before-setter约定的广泛性,如果你计划共享你的代码,为了那些将来可能需要阅读或修改的人,遵循惯例是有意义的。