Dart 中的 int 类型是值类型还是引用类型?

use*_*980 8 dart flutter

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

int i = 10;
print(i.runtimeType is Object);   // returns true
Run Code Online (Sandbox Code Playgroud)

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

如果我是对的,那么 - int i = 10; 意味着 i 是一个引用变量,保存对 int 对象 10 的引用。

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

lrn*_*lrn 6

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

整数是不可变的并假装是规范化的。如果aandbint值 and a == b,那么identical(a, b)保证为真,所以aandb看起来它们是同一个对象,但不确定是因为它们真的是同一个对象,还是因为identical只是作弊和==整数。

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

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


Nit*_*esh 0

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

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

这将导致 true。

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

您可以参考此链接以获取更多信息。希望这可以帮助。