is_same
2026/4/15大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — is_same
is_same
定义
引用同一性判断函数。判断两个变量是否指向内存中的同一个对象,而不是仅仅"长得一样"。
这听起来可能有点抽象,打个比方:假设你和朋友各有一把钥匙——
- 如果你们拿的是同一把钥匙(同一把实体的金属钥匙),那就是"同一个",
is_same返回true - 如果你们拿的是两把一模一样但不同的钥匙(两把相同的复制品),即使它们长得完全一样、能开同一扇门,
is_same也会返回false
再举一个生活中的例子:两本《西游记》的内容完全一样(值相等),但它们是两本不同的实体书(引用不同)。is_same 关心的是"是不是同一本书",而不是"内容一不一样"。
在游戏开发中,is_same 主要用于:
- 检查两个变量引用的是不是同一个节点、同一个资源
- 避免对同一个对象重复执行操作
- 确认某个对象是否就是你要找的那个特定实例
函数签名
C#
// C# 中使用 .NET 标准库的 ReferenceEquals
public static bool ReferenceEquals(object a, object b)GDScript
func is_same(a: Variant, b: Variant) -> bool参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
a | Variant(GDScript)/ object(C#) | 是 | 第一个要比较的变量 |
b | Variant(GDScript)/ object(C#) | 是 | 第二个要比较的变量 |
返回值
返回 bool:
true:两个变量指向内存中的同一个对象(同一个引用)false:两个变量指向不同的对象,即使它们的内容完全一样
代码示例
C#
using Godot;
using System;
public partial class IsSameExample : Node
{
public override void _Ready()
{
// ---- 场景一:基本类型(值类型)----
// 对于数字、字符串等基本类型,相同值就是同一个
int a = 42;
int b = 42;
GD.Print(Object.ReferenceEquals(a, b)); // 输出: True(值类型装箱后可能不同,但语义上相等)
// ---- 场景二:对象引用(引用类型)----
// 创建两个内容相同但不同的数组
var array1 = new Godot.Collections.Array();
array1.Add("苹果");
var array2 = new Godot.Collections.Array();
array2.Add("苹果");
// 内容一样,但是两个不同的数组对象
GD.Print(array1 == array2); // 输出: False(内容比较)
GD.Print(ReferenceEquals(array1, array2)); // 输出: False(不是同一个对象)
// 赋值给新变量,指向同一个对象
var array3 = array1;
GD.Print(ReferenceEquals(array1, array3)); // 输出: True(是同一个对象)
// ---- 场景三:节点引用 ----
var node1 = GetNode<Node>("Player");
var node2 = GetNode<Node>("Player");
// 同一个节点的两次获取,指向同一个对象
GD.Print(ReferenceEquals(node1, node2)); // 输出: True
}
}GDScript
extends Node
func _ready():
# ---- 场景一:基本类型 ----
# 对于数字等基本类型,相同值就认为是"同一个"
var a = 42
var b = 42
print(is_same(a, b)) # 输出: true
# ---- 场景二:对象引用 ----
# 创建两个内容相同但不同的数组
var array1 = ["苹果"]
var array2 = ["苹果"]
# 内容一样,但是两个不同的数组对象
print(array1 == array2) # 输出: true(内容比较)
print(is_same(array1, array2)) # 输出: false(不是同一个对象)
# 赋值给新变量,指向同一个对象
var array3 = array1
print(is_same(array1, array3)) # 输出: true(是同一个对象)
# ---- 场景三:节点引用 ----
var node1 = get_node("Player")
var node2 = get_node("Player")
# 同一个节点的两次获取,指向同一个对象
print(is_same(node1, node2)) # 输出: true注意事项
- "值相等" vs "引用相同":这是最容易混淆的地方。
==比较的是"值相不相等"(内容是否一样),is_same比较的是"是不是同一个对象"(内存地址是否一样)。就像两本内容相同的书——==说"内容一样",is_same说"不是同一本书"。 - 基本类型的特殊行为:在 GDScript 中,对于数字、布尔值等基本类型,
is_same会直接比较值。只有对对象(数组、字典、节点等)才比较引用。 - C# 中的对应函数:C# 中没有 Godot 特定的
is_same函数,应该使用Object.ReferenceEquals(a, b)来判断两个变量是否引用同一个对象。注意不要和==混淆——某些类可能重载了==运算符来比较值而非引用。 null的处理:两个都是null的变量,is_same返回true。
