【问题标题】:Trying to do setters and getters in dart using the get keyword尝试使用 get 关键字在 dart 中执行 setter 和 getter
【发布时间】:2016-04-21 09:43:57
【问题描述】:

我正在写这门课,并注意到你可以在小事上使用的匿名函数设计。

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

我开始思考是否应该以这种方式或标准来做我的 setter 和 getter:

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

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

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

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

那么,哪种方法最好。我正在阅读一个演示,它说匿名函数实际上应该只在函数有理由更改时才使用。我个人认为 getter 应该是传统意义上的函数,但有些事情很简单,只是简写。

如果有像我写的 A 这样的 getter 的简写,是否有 setter 的简写?

【问题讨论】:

    标签: dart


    【解决方案1】:

    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;
    }
    

    你像使用它们一样

    var myClass = new MyClass();
    myClass.isSet = true; // setter
    print(myClass.isSet); // getter
    

    【讨论】:

    • 很高兴知道。因此,在我的示例中,本机: fname 自动具有 getter 和 setter?因此,如果我想通过函数调用在类范围之外访问它们,我可以说什么? Class Person{} Person p = new Person(); p.fname(name); 还是什么?我不喜欢公开变量,例如:p.fname = name;
    • 我在使用 Dartpad 时确实注意到,即使它被分配为变量,它也可以从类中公开访问以进行分配。有没有办法将它们设为私有或受保护?
    • 我知道根据信息,它说_ 用于表示私有变量....虽然它们现在不是真的私有的,是吗?跨度>
    • 哦,在堆栈溢出中发现它。谢谢。生病在这里链接它。 stackoverflow.com/questions/17488611/…
    • 我更新了我的答案。在 Dart 中,您可以通过以下划线 (_) 开始名称来将字段、getter/setter 和函数/方法设为私有。您读取和设置 getter/setter 与字段相同(请参阅我的更新)。
    【解决方案2】:

    unnecessary_getters_setters

    来自风格指南:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 2020-12-02
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多