尝试使用 get 关键字在飞镖中执行 setter 和 getter

Trying to do setters and getters in dart using the get keyword

我正在写这篇文章 class,并注意到可以用于小事情的匿名函数设计。

String get fullName => "$fname $lname";   //A

然后我开始考虑我是否应该以这种方式或标准来做我的 setters 和 getters:

void setFullName( String fn, String ln ) {   //B
  fname = fn; 
  lname = ln; 
}

String getFullName(){   //C
  return "$fname $lname"; 
}

我知道AC的区别是一个是方法,一个不是。

print(fullName);
// vs
print(getFullName());

那么,哪种方法最好。我正在阅读一个演示,其中说匿名函数实际上只应在函数有理由更改时使用。我个人认为 getters 应该是传统意义上的函数,但有些事情很简单 shorthand.

如果像我写的那样 getter 有一个 shorthand,那么 setter 有一个 shorthand 吗?

Dart 中的 First 字段由 getter 和 setters 自动包装。如果您使用反射(镜像)来查询 class 的成员,您将得到 getter 和 setter 而不是字段。
这也反映在 Dart 风格指南中:

Don't wrap fields with getters/setters just to be sure.

您可以随时将字段更改为 getters/setters,而不会破坏使用您的 class 的代码。

getters/setters 需要考虑的其他事情是:它们不应该进行昂贵的计算并且它们不应该 side-effects(调用 setter 时设置支持字段除外).

如果满足这些条件(并且您不需要额外的参数),那么使用 getters/setters.

通常是个好主意

注意:short-hand函数符号不限于getters/setters,他们也不需要它。您也可以将它用于函数,您也可以为 getters/setters 使用块体。

bool _isSet;
bool get isSet {
  return _isSet;
}
set isSet(bool value) {
  if(value is null) {
    throw new ArgumentError();
  }
  _isSet = value;
}

并且你像这样使用它们

var myClass = new MyClass();
myClass.isSet = true; // setter
print(myClass.isSet); // getter

unnecessary_getters_setters

来自风格指南:

为了“安全”,避免在 getter 和 setter 中包装字段。

在 Java 和 C# 中,将所有字段隐藏在 getters 和 setters(或 C# 中的属性)后面是很常见的,即使实现只是转发到字段.这样,如果您需要在这些成员中做更多的工作,则无需接触调用点。这是因为调用 getter 方法不同于访问 Java 中的字段,并且访问 属性 与访问 C# 中的原始字段不二进制兼容。

Dart 没有这个限制。 Fields 和 getters/setters 完全没有区别。您可以在 class 中公开一个字段,然后将其包装在 getter 和 setter 中,而无需触及任何使用该字段的代码。