尝试使用 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";
}
我知道A
和C
的区别是一个是方法,一个不是。
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 中,而无需触及任何使用该字段的代码。
我正在写这篇文章 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";
}
我知道A
和C
的区别是一个是方法,一个不是。
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 中,而无需触及任何使用该字段的代码。