flutter Dart中的“私有财产”是什么?

dffbzjpn  于 2023-06-07  发布在  Flutter
关注(0)|答案(4)|浏览(300)

在学习Dart时,我注意到私有属性以下划线开头。私有财产是什么意思?

class OfficialName extends Name {
 // Private properties begin with an underscore
 final String _title;
  
 OfficialName(this._title, String first, String last)
 : super (first, last);

 @override
 String toString(){
   return 'S_title. ${super.toString()}';
 }
}
qmelpv7a

qmelpv7a1#

私有属性是那些只能在声明它们的文件中访问的属性。换句话说,只有dart文件中的dart代码(在其中找到这些私有属性)“知道”私有属性。
考虑下面的例子
lib/foo.dart

class Foo {
  var _foo = 'foo';
  var bar = 'bar';
}

main() {
  print(Foo()._foo); // foo
  print(Foo().bar);  // bar
}

然后在lib/bar.dart

import './foo.dart';

main() {
  // print(Foo()._foo); // this won't work
  print(Foo().bar); // bar
}

运行这两个文件将显示注解结果。但是如果bar.dart中的print(Foo()._foo);行未注解,编译器将抛出一个错误,即getter '_foo'没有为类'Foo'定义。这是因为Foo类上的_foo属性对于foo.dart文件是私有的。
在Dart中,每个文件都是一个库。因此,将隐私或私有属性的范围限定在每个库中是有意义的。
要创建私有属性,无论是字段还是方法,只需在其名称前面加上下划线_
所以在编码时,如果您觉得其他dart文件(或库)不应该访问某些属性(可能是因为隔离逻辑),那么您可以将它们设置为私有(通过使用下划线_作为前缀)。

w8ntj3qf

w8ntj3qf2#

Dart隐私确实只是基于每个库。

wlwcrazw

wlwcrazw3#

我是这样理解的,我们来谈谈你的例子。
final String _title;表示我们的标题是私有的。
如果我们用下划线声明一个变量,我们不能改变它的属性。
让我们创建一个OfficialName对象并打印它。

OfficialName ofName = OfficialName("Dr", "John", "kim");

  print("From constructor=> title: ${ofName._title} first: ${ofName.first} last: ${ofName.last}");

现在如果我们想改变这个对象的属性值,我们可以这样做
ofName.first= "new value"但是,我们不能在这里更改_title。我认为私有财产是不可变的。

示例代码

class Name {
  String first;
  String last;

  Name(this.first, this.last);
}

class OfficialName extends Name {
  // Private properties begin with an underscore
  final String _title;

  OfficialName(this._title, String first, String last) : super(first, last);

  @override
  String toString() {
    return 'S_title. ${super.toString()}';
  }
}

// Main function
void main() {
  OfficialName ofName = OfficialName("Dr", "John", "kim");

  print(
      "From constructor=> title: ${ofName._title} first: ${ofName.first} last: ${ofName.last}");

  ///let's change some property

   /// this will show errors
  ofName._title = "changed title";

  ofName.first = "firstName";

  ofName.last = "lastName";

  print(
      "After changed=> title: ${ofName._title} first: ${ofName.first} last: ${ofName.last}");
}

有关详细信息,请访问language-tour

ohfgkhjo

ohfgkhjo4#

下划线确定该标识符对外的可见性:
import和library指令可以帮助您创建模块化和可共享的代码库。库不仅提供API,而且是一个隐私单元:**以下划线(_)开头的标识符仅在库中可见。**每个Dart应用都是一个库,即使它不使用库指令。
来自dart文档

相关问题