【问题标题】:Is int type in Dart a value type or reference type?Dart 中的 int 类型是值类型还是引用类型?
【发布时间】:2020-07-01 10:52:18
【问题描述】:

Dart 中的 int 类型默认值为 null。 null 是 Null 类类型的对象。 (根据 Dart 文档)。此外,在 Dart 中,int 派生自类 Object。 因此,

int i = 10;
print(i.runtimeType is Object);   // returns true

这让我相信 int 不是像其他语言(如 C#)那样的值类型,而是引用类型。

如果我是对的,那么—— int i = 10; 表示 i 是一个引用变量,持有对 int 对象 10 的引用。

这是正确的吗?如果没有,如果共享文档中描述的链接,我将不胜感激。 到目前为止,我一直找不到任何适当的解释,因此我自己得出了这个结论。 谢谢。

【问题讨论】:

  • 由于ints 是不可变的,我认为没有任何明显的区别。

标签: flutter dart


【解决方案1】:

是的,Dart 的 int 类型是“引用类型”。 Dart 根本没有值类型,所有值都是类的实例,包括整数。 (至少在技术上,函数值使得它们的类很难被看到。)

整数是不可变的,并伪装成规范化。 如果a 和b 是int 值和a == b,则identical(a, b) 保证为真,所以a 和b 看起来它们是同一个对象,但不确定是否是因为它们确实是同一个对象,或者是因为 identical 只是作弊并为整数使用 ==。

这意味着您可以在很大程度上将int 视为“值类型”。无论是在赋值或参数传递时复制,还是在传递对同一对象的引用,都无法区分。该语言确保了这一点,因为它允许实现做任何更有效的事情。 在实践中,一些整数在函数内部被拆箱,一些整数作为值存储在引用本身中,还有一些是真实的对象。 (这也是您不能将Expando 与int 一起使用的原因之一。

(在当前的 Dart 语言中,所有类型的注解都可以为空,这意味着您可以将 null 分配给 int x;。随着即将推出的 Null Safety 功能,这种情况发生了变化。类型只有在您这样编写时才能为空,所以int x = 1; 不会接受null 值,但int? x; 会。而且null 也是一个对象,是Null 类的唯一实例。)

【讨论】:

    【解决方案2】:

    int 是一种值类型,如果将int 值传递给函数并更改函数内部参数的值,则不会影响外部范围。

    void add(int inner) {
      inner += 1;
    }
    
    int outer = 0;
    add(outer);
    print(outer); // 0, unchanged
    

    但int 仍然是一个类,尽管它的名称以小写字母开头。关于它的命名有一个huge discussion,很多人认为它不一致。

    【讨论】:

    • 如果我在您给定的示例中将 int 更改为 String 并在 add 中执行 inner += "1" ,即使这样外部的值也不会改变。因此,根据您的逻辑,即使 String 不是值类型,它也可以充当值类型......因此这个例子不是很清楚。
    【解决方案3】:

    是的int 是一个类(它甚至扩展了num),因此有通用的方法可以使用。但另一方面,它与“普通”类不同,因为您不必使用像

    这样的构造函数
    int i = int(3);
    

    查看 int 的类文档https://api.dart.dev/stable/2.8.4/dart-core/int-class.html

    【讨论】:

      【解决方案4】:

      Dart 中的一切都是对象,int、double 或 num 可能看起来像关键字,但它们是内置的抽象类。由于它们是抽象类,这意味着它们不能被实例化,它们不以大写字母开头。

      试试这条线, print('2 is instance of "int" class :\t${ 2 is int}');

      这将导致 true。

      关于您对 'null' 的担忧: 在 Dart 中,与 JavaScript 和 Python 一样,变量可以包含的所有内容都是一个对象,包括 null。每个包含 null 的对象都是某个类的实例,所有这些类都继承自 Object 类。

      您可以参考this link 了解更多信息。 希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2010-12-04
        • 2013-07-14
        • 2013-01-11
        • 2010-11-07
        • 1970-01-01
        • 2019-02-07
        • 2020-03-19
        • 2011-01-21
        • 1970-01-01
        相关资源
        最近更新 更多