为什么在 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。
更严重的是,我猜测是因为无论谁编写了该代码片段(或者在 VS 中自动生成属性代码的任何内容)都潜意识地选择了这个顺序。
对于这位开拓性的牧羊人来说,我们其他人都只是羊,所以我们毫无疑问地跟随了。
直到你。
你质疑我们曾经伟大的牧羊人,无政府状态只能随之而来。提交您的代码并奔向山丘。
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-before-setter 约定的广泛性,如果您打算共享代码,那么为了将来可能需要阅读或更改它的人,遵循约定是有意义的。
@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;
}
}
?>
相关