【问题标题】:Why can we not change the variable value if initialises at the time of declaration?如果在声明时初始化,为什么我们不能更改变量值?
【发布时间】:2022-01-14 11:55:46
【问题描述】:

我正在学习飞镖,飞镖的这种行为让我很烦

var a=10;
a="John";    //it generates an error, because a has integer data-type and we can't assign 
             //string or the value of any other data type because we have assigned an 
             //integer value

但同时,dart 允许我们编写

var a;
a=10;
a="John";
print (a)     //it displays John

这意味着当变量在声明时初始化时,我们不能分配任何其他数据类型的值,但是如果变量在一行中声明并在第二行初始化,我们可以分配任何其他数据类型的值线。为什么飞镖会这样工作?

【问题讨论】:

    标签: dart dart-null-safety


    【解决方案1】:

    var 关键字用于让 Dart 根据您用于初始化变量的值自动为变量分配类型。

    如果您在不提供任何初始值的情况下使用var,您的变量类型将自动分配给dynamic,这允许将任何类型的对象分配给该变量。但这也意味着您的程序的类型安全性要低得多,因为分析器无法再帮助您了解变量将返回的类型以及设置变量时允许的类型。

    因此,在您的第一个示例中,a 被分配了 int 类型,因为您提供了 10 作为初始值。因此,当您尝试将 String 设置为 int 变量的新值时,会出现编译错误。

    在您的第二个示例中,a 将是 dynamic,因为您没有提供任何初始值。所以先给它10 再给它'John' 不是问题,因为dynamic 允许我们使用任何类型。但这也意味着当我们尝试在程序中使用a 时,Dart 无法保证您将获得什么类型的对象,因此错误将首先在运行时被识别。

    【讨论】:

    • 你说你的变量的类型被自动分配给动态但是当我们不初始化一个变量时它不属于dynamic而是属于Null 类,因为 null 被分配为默认值 `var a;打印(a.runtimeType); //它显示 Null ` 那么,dynamic 到底是什么?这只是一个术语吗?
    • @MuhammadAfzal 正确。但是由于 var a; 如果被分配类型 Null 将有点没用,Dart 在这种特定情况下确实改为 dynamicdynamic 表示 Object?(因为这是我们对类型了解最少的),但是当您尝试在 a 上调用/访问某些内容时,Dart 不会抱怨,因为 dynamic 表示静态类型系统不应该抱怨,因为你,程序员,承诺知道你在做什么将在运行时工作。 :)
    • 我应该补充一点,如果您不希望在这些“偷偷摸摸”的情况下隐式键入 dynamic,您可以在分析器中禁用该功能:dart.dev/guides/language/…。就个人而言,我总是在禁用implicit-castsimplicit-dynamic 的情况下运行,因为我不太喜欢这种“惊喜”。如果你禁用implicit-dynamic,你就不能再写var a;,因为你会得到一个“缺少'a'的变量类型”。分析仪的错误。 var a = 5; 仍然有效,因为我们用值初始化了变量
    • 感谢您的精彩解释,我绝对禁用隐式动态
    【解决方案2】:

    那是因为var 意味着 dart 将自己分配变量的类型。

    在第一种情况下,dart 将变量 a 分配为 int 类型,因为它在初始化期间被赋予了一个值。

    但在第二种情况下,dart 将变量 a 分配为 dynamic,这就是为什么您可以稍后将其分配为字符串或 int。

    【讨论】:

    • 我只是检查了a 的类型,它是Null,那么dart 分配的变量a 是动态的是什么意思
    • 是的,一开始a的runTimeType是Null,但后来runTimeType变成int然后String,这些runTimeType被允许被dart改变因为它在初始化期间被编译器整体分配为动态的。看一下这个。 stackoverflow.com/questions/12416507/…
    • 非常感谢,您分享的链接对我帮助很大。 dynamic 是其他类型 int 或 double 但不同之处在于用 dynamic 声明的变量即使在被赋值后也可以改变它们的类型。动态的; a=123;一个=“ABC”。当我们不使用 var 关键字为变量赋值时,比如 var a;那么它的行为与动态相同,了解所有飞镖对象​​的动态也很重要。 ——
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2017-06-22
    • 2021-12-28
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多