Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用get关键字在dart中执行setter和getter_Dart - Fatal编程技术网

尝试使用get关键字在dart中执行setter和getter

尝试使用get关键字在dart中执行setter和getter,dart,Dart,我在写这门课,注意到你可以在小事情上使用anon函数设计 String get fullName => "$fname $lname"; //A 我开始思考我是应该用这种方式还是标准来做我的二传手和接球手: void setFullName( String fn, String ln ) { //B fname = fn; lname = ln; } String getFullName(){ //C return "$fname $lname"; }

我在写这门课,注意到你可以在小事情上使用anon函数设计

String get fullName => "$fname $lname";   //A
我开始思考我是应该用这种方式还是标准来做我的二传手和接球手:

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

String getFullName(){   //C
  return "$fname $lname"; 
}
我知道
A
C
之间的区别在于一个是方法,而另一个不是

print(fullName);
// vs
print(getFullName());
那么,哪种方法是最好的。我在读一个演示,它说anon函数实际上只应该在函数有理由更改时使用。我个人认为getter应该是传统意义上的函数,但有些事情很简单,只需进行速记即可


如果有一个getter的速记,就像我写的
a
,那么有一个setter的速记吗?

Dart中的第一个字段由getter和setter自动包装。如果使用反射(镜像)查询类的成员,则会得到getter和setter,而不是字段。
这也反映在省道样式指南中:

为了确保这一点,不要用getter/setter包装字段

您可以随时将字段更改为getter/setter,而不会破坏使用您的类的代码

对于GETS/SETTER,需要考虑的其他事项是:它们不应该做昂贵的计算,并且不应该有副作用(除了在调用SETER时设置后退字段)。< / P> 如果满足这些条件(并且您不需要额外的参数),那么使用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

不必要的接受者

从样式指南中:

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

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

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


很高兴知道。因此,在我的示例中,fname自动有一个getter和setter?所以,如果我想通过函数调用在类的作用域之外访问它们,我可以说什么<代码>类Person{}Person p=newperson();p、 fname(姓名)还是什么?我不喜欢公开变量,比如:
p.fname=name我在使用Dartpad时注意到,即使它被指定为变量,也可以从类中公开访问它以进行指定。有没有办法使它们成为私有的或受保护的?我知道根据信息,它说
\uu
是用来表示私有变量的。。。。虽然它们现在不是真正的私有,是吗?哦,在堆栈溢出中找到的。谢谢我把它链接到这里。我更新了我的答案。在Dart中,通过以下划线(
\uuu
)开头的名称使字段、getter/setter和函数/方法成为私有的。读取和设置getter/setter与字段相同(请参阅我的更新)。