【发布时间】:2021-03-27 21:01:50
【问题描述】:
我来自 Javascript 的“let”,我对 var 和其他类型之间的最大区别有点困惑。我知道在某些情况下我们需要使用 var(匿名数据类型),而在某些情况下我们需要使用显式类型。我也明白 var 不够简洁,类型更多,但是在 Flutter 开发中使用类型而不是 var 是否有更深入或实际的应用?
【问题讨论】:
标签: javascript flutter dart
我来自 Javascript 的“let”,我对 var 和其他类型之间的最大区别有点困惑。我知道在某些情况下我们需要使用 var(匿名数据类型),而在某些情况下我们需要使用显式类型。我也明白 var 不够简洁,类型更多,但是在 Flutter 开发中使用类型而不是 var 是否有更深入或实际的应用?
【问题讨论】:
标签: javascript flutter dart
你永远不需要使用var;您始终可以选择指定显式类型。
var 用于如果您想声明一个变量并希望类型是从初始化程序推断。 (如果没有初始化器,变量将是dynamic 类型。但是,由于dynamic 禁用对该变量的静态类型检查并产生额外的运行时成本,您should avoid dynamic when possible 并且应该明确地将变量作为dynamic 时这是必要的。
如果变量类型是可推断的,那么使用隐式类型还是显式类型是风格问题。
使用显式类型的优点:
使用隐式类型的优点:
List someList = [1, 2, 3];actually declares someList to be of type List<dynamic>,即使右侧被推断为List<int>。【讨论】:
Dart 是一种静态类型语言,因此 Dart 需要能够在某个时候确定类型。但它也足够聪明,可以根据上下文自动确定类型。例如。函数返回值的类型。
这确实是一个关于样式的问题,但我个人认为应该为方法签名和类变量指定类型。对于方法内的所有变量,我将使用 var/final 并使用明确的变量名。
我尝试尽可能多地使用 var/final 的另一个原因是,这可以防止一些令人讨厌的问题,例如泛型(List list = <String>['test'] 使 list 变量成为 List<dynamic> 类型。
dynamic 在 Dart 中实际上只是对编译器说“让它通过并检查程序在运行时是否有意义”。所以我们真的不想在我们的代码库中有太多dynamic,因为我们使用编译器的能力来静态检查你的程序是有意义的。
【讨论】:
你有
var 多重赋值和动态类型。 它可以从不同类型的表达式中分配。注意,Dart 会推断出正确的类型,只要你使用 var 时同时声明和初始化变量。
final 单人作业。 它通常用于在小部件类中声明属性。
const 编译时间常数。
尽可能选择 const 而不是 final。
【讨论】: