尝试使用get关键字在dart中进行设置和获取

Fal*_*per 2 dart

我正在编写此类,并注意到可以用于小物件的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的速记吗?

Gün*_*uer 8

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)


Tok*_*ris 5

不必要的getters_setters

来自风格指南:

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

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

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

在此输入图像描述