我正在编写此类,并注意到可以用于小物件的anon函数设计。
String get fullName => "$fname $lname"; //A
Run Code Online (Sandbox Code Playgroud)
我开始思考是否应该以这种方式或标准来进行设置和获取:
void setFullName( String fn, String ln ) { //B
fname = fn;
lname = ln;
}
String getFullName(){ //C
return "$fname $lname";
}
Run Code Online (Sandbox Code Playgroud)
我知道A和之间的区别C是,一种是方法,而另一种则不是。
print(fullName);
// vs
print(getFullName());
Run Code Online (Sandbox Code Playgroud)
因此,哪种方法最好。我正在阅读一个演示,该演示说anon函数实际上仅应在有理由更改的情况下使用。我个人认为,吸气剂应该是传统意义上的功能,但是有些事情只需要简写就很简单。
如果像我所写的那样有一个getter A的速记,那么有一个setter的速记吗?
Dart中的First字段由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;
}
Run Code Online (Sandbox Code Playgroud)
你像这样使用它们
var myClass = new MyClass();
myClass.isSet = true; // setter
print(myClass.isSet); // getter
Run Code Online (Sandbox Code Playgroud)
不必要的getters_setters
来自风格指南:
为了“安全”,避免将字段包装在 getter 和 setter 中。
在 Java 和 C# 中,通常将所有字段隐藏在 getter 和 setter(或 C# 中的属性)后面,即使实现只是转发到该字段。这样,如果您需要在这些成员中做更多工作,则无需接触调用点即可完成。这是因为调用 getter 方法与访问 Java 中的字段不同,并且访问属性与访问 C# 中的原始字段不具有二进制兼容性。
Dart 没有这个限制。字段和 getter/setter 是完全无法区分的。您可以在类中公开一个字段,然后将其包装在 getter 和 setter 中,而无需触及任何使用该字段的代码。
| 归档时间: |
|
| 查看次数: |
4614 次 |
| 最近记录: |