经常搞不清楚dart命名参数比位置参数的区别?现在我们来对比一下,位置参数与命名参数的区别。

Dart 有两种类型的可选参数,分别是命名可选参数和位置可选参数。在我讨论差异之前,让我先看看两者的相似之处。

Dart 可选命名参数和可选位置参数在调用函数时不需要为参数指定值。可选命名参数和可选位置参数只能在任何必需参数之后声明。

可选命名参数和可选位置参数可以有一个默认值,在调用者没有指定值时使用。这就是两种可选参数相同点。

不同之处是可选位置参数使用[ ]包裹参数。可选命名参数使用{ }包裹参数。

可选位置参数

使用[ ]包裹的参数是一个可选位置参数。例如代码getHttpUrl(String server,[int port=80]) {}port是可选的,默认值为80

您可以在调用getHttpUrl使用或不使用第三个参数。这种方式声明函数的好处是使你的代码更为简洁,但缺失可读性。

例如以下代码,除非您知道8080和5是什么,否则很难说出那些看似神奇的数字是什么。您可以使用命名的可选参数来创建更具可读性的API。

getHttpUrl(String server,url,String url,[int port=80]) {}
getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80

可选命名参数

使用{ }包裹的参数是一个命名的可选参数。您可以使用或不使用位置可选参数。但是当你使用位置可选参数时,你必须使用参数名称传递参数。

在命令可选参数中,你不必按顺序传递可选的命名参数,因为命名参数是按名称引用,所以它们的使用顺序可以不同于它们的声明顺序。

这一点相对于位置可选参数,更易于阅读和理解,缺点就是不够简洁。在两者的选择取决你个人需求。

getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}
getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

结论

至此,你已经了解如何在可选位置参数和命名可选参数之间的区别。可选项位置参数会使代码更为简洁,可选命名参数会使代码易于阅读和理解。

在两者的选择取决你个人需求。如你任何问题,请发表你的评论。