天天看点

Dart 基础类型 var、dynamic、object、finaldart的前世今生类型安全vardynamic Objectfinal总结

dart的前世今生

在开始之前,建议阅读这篇文章,介绍了dart语言的背景、想要解决的问题等等【科普】Dart语言

类型安全

首先要明确一点,dart是强类型语言或者叫类型安全,何为强类型,简单来说就是变量一但确认它的类型,除非明确进行类型转换,否则不可以被当做其他类型使用,这点和JS等弱类型语言是有区别的。

如果对强弱类型感兴趣,可以参考:什么是强类型语言,什么是弱类型语言,为什么python也是强类型语言。

dart为什么要使用强类型,在其官网中也有介绍Dart 语言里的类型体系

在编译时就可以检查并显示类型相关的错误。

安全的类型系统强制要求代码明确类型,因此在编译时会显示与类型相关的错误,这些错误可能在运行时可能很难发现。

代码更容易阅读。 代码更容易阅读,因为我们信赖一个拥有指定类型的值。在类型安全的 Dart 中,类型是不会骗人的。因为一个拥有指定类型的值是可以被信赖的。
代码可维护性更高。 在安全的类型系统下,当更改一处代码后,类型系统会警告因此影响到的其他代码块。
更好的 AOT 编译。 虽然在没有类型的情况下可以进行 AOT 编译,但生成的代码效率要低很多。

var

虽然dart是强类型语言,但是它仍然保留了一个var、dynamic等关键词来提供类型转换,var会自动识别定义变量的类型,比如定义一个string

String s = 'this is a string';
//or
var s;
s = 'string'; //这时,s的最终类型就被确定
           

使用var来定义,如有初始值,则该变量类型即确定,无法就不能更改,如果初始值没有定义,则该变量还可以更改类型,示例如下:

var s = 'this is a string'; // s is String
s = 1;// error

var s ;  //dynamic
s = 'string';
s = 1; //correct
           

再第二个例子中,s因为没有初始化,则其其实为dynamic类型,可以更改类型

dynamic Object

dynamic和Object的用法如上述所示,可以动态更改类型,如

dynamic a = '5';
a = 5; //correct

Object b = '5';
b = 5; //correct
           

不同之处

那两者的不同之处是什么呢,Stack Overflow有个回答直接搬过来what-is-the-difference-between-dynamic-and-object-in-dart

简单来说,就是dynamic拥有任何可能类型的方法和属性,而object不能,比如:

dynamic a;
Object b;

main() {
  a = "";
  b = "";
  printLengths();
}

printLengths() {
  // no warning
  print(a.length);

  // warning:
  // The getter 'length' is not defined for the class 'Object'
  print(b.length);
}
           

final

fianl用来定义常量,同样用于定义常量的还有const,两者的区别在于:

  1. const 是编译常量,编译的时候就要确定常量值,而final是运行时常量,只需要运行的时候确定常量时即可,而且final
  2. final 可以惰性初始化

先看例子:

const a; //error 这里一定要指定值
final a; 
a = 5; //correct

const a =  DateTime.now(); //error
final b = DateTime.now();

           

这里的const在定义的时候,一定要是有明确的值,且在编译的时候就要确定,而final不需要,可以动态指定,延后指定

总结

看了上述的解释,用来的时候有什么建议呢?

  1. final用来处理只需要初始化一次的值,比如一些类的初始参数等
  2. 普通的参数尽可能用var,且最好初始化,这样可以先发享受类型安全的好处,尽可能发挥dart的性能
  3. 其他情况就自由发挥了