两个问题。 第一, 以下是强类型。
String msg = "Hello world.";
msg = "Hello world again.";
而且,低于动态
var msg = "Hello world.";
msg = "Hello world again.";
上面两个'msg之间有什么区别吗?
其次,如果我使用'new'关键字来启动如下变量,
Map myMap = new Map;
为什么要指示变量'myMap'是一个Map实例(Map myMap),因为'new'关键字已经包含了相同的含义?所以,不是没关系,
myMap = new Map;
因为'new'关键字已经暗示新发起的变量既是变量又是Map类型,我无法理解为什么'Map'关键字通常带有变量名,甚至'var'也是如此。
有没有人对此有任何想法(似乎有点多余)Dart语法?
答案 0 :(得分:3)
String msg = "Hello world.";
msg = "Hello world again.";
msg = 1; // exception in checked mode - int can not be assigned to String.
var msg = "Hello world.";
msg = "Hello world again.";
msg = 1; // ok in checked mode
Checked模式是开发人员模式,其中检查类型注释并在代码违反时创建运行时异常。
在未选中(生产)模式下,如果添加类型注释和哪一个注释,则没有任何区别。这是出于性能原因,因为检查模式较慢。
答案 1 :(得分:2)
关于第一个问题,每个msg
变量包含的内容没有区别。
对于Map问题,指定在声明中构造的变量类型的原因是允许子类具有一定的灵活性。以下面的代码为例:
class SubMap extends Map {
SubMap() : super();
}
Map map = new SubMap();
这里我们有一个变量map
,它包含一个SubMap
对象作为其值,但我们允许它包含类型Map
的值(或其他类型的子类{{1}在以后的时间。
Dart要记住的主要事情是它可选择输入。运行代码时,您的类型注释都不会产生任何差异(除非您以检查模式运行)。注释的类型是帮助您的IDE和其他工具提供自动完成帮助,可能的警告等,其他完全动态的语言,如Javascript不能。
答案 2 :(得分:2)
声明Map myMap = new Map()
做了三件事:
myMap
的变量,其中包含type-annotation Map
,Map
构造函数和类型注释意味着myMap
具有静态类型Map
。静态类型可以在编译时给你一些警告,但它不会在运行时改变任何东西。
类型注释还在已检查模式下添加类型检查,其中检查对变量的任何分配是否可分配给Map
。
您创建的对象可以是使用任何构造函数的任何对象。我经常使用new HashMap()
代替new Map()
,并仍然将其分配给键入为Map
的变量。
然后将对象分配给变量,如果处于选中状态,则类型检查成功。
该变量独立于用于初始化它的值。如果稍后将字符串分配给myMap
变量,则它将在检查模式下失败。
因此,两个msg
变量之间的区别在于,一个变量具有静态类型,并且在检查模式下具有类型检查。
对于您显示的代码,行为没有区别。
如果下一行是var y = msg + 42;
,则输入的版本会发出警告(msg
包含静态类型String
,而String.operator+
的类型为String->String
,因此42
的参数类型无效),无类型版本不会警告您(msg
类型为dynamic
,因此您可能知道自己在做什么)。< / p>