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

时间:2016-01-15 18:07:00

标签: dart

我正在写这门课,并注意到你可以用来做小事的anon功能设计。

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

我想到我是否应该以这种方式或标准做我的安装者和吸气剂:

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

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

我知道AC之间的区别在于,一个是方法而另一个不是。

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

那么,哪种方法最好。我正在阅读一个演示,说明当函数有理由改变时,真的只能使用anon函数。我个人认为吸气剂应该是传统意义上的功能,但有些事情只是简单易行。

如果像我写A那样有一个吸气的速记,那么是否有一个速记器的速记?

2 个答案:

答案 0 :(得分:4)

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

  

为了确定,不要用getter / setter包装字段。

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

getter / setter要考虑的其他事项是:他们不应该进行昂贵的计算,并且他们不应该有副作用(除了在调用setter时设置支持字段)。

如果符合这些标准(并且您不需要其他参数),那么使用getter / setter通常是一个好主意。

注意:简写功能符号不仅限于getter / setter,他们也不需要它。您也可以将它用于函数,也可以为getter / setter设置块体。

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

答案 1 :(得分:1)

unnecessary_getters_setters

来自风格指南:

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

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

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

enter image description here