我正在写这门课,并注意到你可以用来做小事的anon功能设计。
String get fullName => "$fname $lname"; //A
我想到我是否应该以这种方式或标准做我的安装者和吸气剂:
void setFullName( String fn, String ln ) { //B
fname = fn;
lname = ln;
}
String getFullName(){ //C
return "$fname $lname";
}
我知道A
和C
之间的区别在于,一个是方法而另一个不是。
print(fullName);
// vs
print(getFullName());
那么,哪种方法最好。我正在阅读一个演示,说明当函数有理由改变时,真的只能使用anon函数。我个人认为吸气剂应该是传统意义上的功能,但有些事情只是简单易行。
如果像我写A
那样有一个吸气的速记,那么是否有一个速记器的速记?
答案 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 中,而无需接触使用该字段的任何代码。