我是Dart的新手。该文档说:“要测试两个对象x和y是否表示同一对象,请使用==运算符。(在极少数情况下,您需要知道两个对象是否完全相同,请使用same()函数代替。”
因此,如果输入以下代码:
var foo = 'bar';
var baz = 'bar';
print(identical(foo, baz));
如果我很了解,foo和bar不会引用同一对象。所以same()必须返回false,不是吗? 至少在DartPad中不是这样。
问题出在哪里。
答案 0 :(得分:3)
在这种情况下,foo
和bar
确实引用了同一对象。
这是因为编译器 canonicalize 字符串文字。
该规范要求将大多数常量规范化。如果在两个地方创建const Duration(seconds: 1)
,它将成为 same 对象。整数,双精度和布尔值总是规范化的,无论是否恒定(该语言假装每个值只有一个实例)。
字符串的特殊之处在于,对于是否需要规范化规范尚不完全清楚,但是为了使常量有意义,需要对 constant 字符串 进行规范化,所有编译器都这样做。
文字是一个常量表达式,因此字符串文字总是规范化的。这意味着'bar'
表示相同的对象,无论它出现在代码中的什么位置。
答案 1 :(得分:1)
对于多个内置的“文字”,对于相等的值,您将始终获得相同的true
。
答案 2 :(得分:0)
如Kevin Moore所述,某些文字是隐式常量。如果用相同的属性初始化常量,则它们的值是相同的。
检查一下:
void main() {
// Without constant constructor
var houseA = House(100, 100);
var houseB = House(100, 100);
print(identical(houseA, houseB)); // Output: false
// With constant constructor
houseA = const House(100, 100);
houseB = const House(100, 100);
print(identical(houseA, houseB)); // Output: true
}
class House {
final int width;
final int height;
const House(this.width, this.height);
}