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

问题描述 投票:0回答:5
我知道这个问题有点愚蠢,所以如果这是偏离主题或没有建设性的,我提前道歉。

为什么在 C# 中使用 getter 在 setter 之前定义属性是标准约定*?对于同时具有两者的属性,您几乎总是会在 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。

c# properties coding-style conventions
5个回答
19
投票
因为给予比接受更好。

更严重的是,我猜测是因为无论谁编写了该代码片段(或者在 VS 中自动生成属性代码的任何内容)都潜意识地选择了这个顺序。

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

直到你。

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


13
投票
吸气剂通常要短得多(通常是一行),因此将其放在开头可以让您更好地概览,就像您会更喜欢这样:

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 }

更重要的是 - 只是因为。


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


0
投票
我认为这里重要的是一致性。虽然在您的示例中,设置器“更有趣”,但我认为大多数情况下不一定是这种情况。事实上,自动属性如此有用的原因之一是因为获取和设置代码只是从私有字段读取/写入私有字段而没有其他处理的频率,在这种情况下,两者都不是“更有趣”。

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


0
投票
我同意

@YoryeNathan这样一个既有趣又充分的观点。

我也对顺序的重要性感到好奇,最常提出的结论是:数据表示在代码及其一般流程中不应该很重要吗?所以我们只能在之前设置过的时候才能得到任何东西。当然,设置是第一个!”,但是......我仍然在我的代码中看到以下内容:

return [ 'a' => 1, 'b' => 2, 'c' => [ 'a' => 1, 'd' => 3, ], ];
...当我仔细观察时,我发现第一个是更简单或更短的数据,也允许更多数据出现在屏幕上,但仍然处于有组织的结构中。无论是像 JSON/YAML 这样的配置或数据文件,还是像类这样的源代码成员,感觉像 '{enabled: true; }' 应该更高,并且更复杂的数据向下移动。

考虑到“通常”(基于主观经验),

getters

确实比一般类或复杂的相对非标准 DTO 中的
setters
更短,即使具有额外的验证和“密封”功能,具有 
getters
我相信,在更高的水平上,并在成员范围内拥有这些群体,使其更加充分。更不用说“get/set”应该是分组的。

示例

<?php use InvalidArgumentException; class C1C2 { // Public Fields // ---------------------------------------------------------------- public readonly ?int $a; // Protected Fields // ---------------------------------------------------------------- protected readonly ?int $b; // Private Fields // ---------------------------------------------------------------- private ?int $c1; private ?int $c2; // Constructor // ---------------------------------------------------------------- public function __construct(int $a, int $b) { $this->a = $a; $this->b = $b; } // Getters/Setters // ---------------------------------------------------------------- // C1 // -------------------------------- public function getC1(): int { return $this->c1; } public function setC1(int $value): void { if ($value <= 0) { throw new InvalidArgumentException(); } $this->c1 = $value; } // C2 // -------------------------------- public function getC2(): int { return $this->c2; } public function setC2(int $value): void { if ($value <= 0 || $value > 200) { throw new InvalidArgumentException(); } $this->c2 = $value; } } ?>
相关

按什么顺序定义 getter 和 setter?

© www.soinside.com 2019 - 2024. All rights reserved.