unity C#中使用ref、out区别和使用案例

文章目录

      • [ref 关键字](#ref 关键字)
      • [out 关键字](#out 关键字)

在Unity(以及C#编程语言中), refout 都是用来传递参数的引用,这意味着它们允许函数修改实参变量,并且这些修改会反映到调用函数的地方。但它们之间确实存在一些关键区别和使用场景:

ref 关键字

  1. 作用

    • 使用 ref 关键字时,传递给方法的参数必须在调用前已初始化。
    • 方法可以读取并修改通过 ref 传递的变量。
  2. 特点

    • 函数接收的是引用,可以在函数内部读取原有值并对其进行修改。
    • 调用函数时必须显式赋值,即 MethodName(ref int variable)
  3. 优缺点

    • 优点:能够有效提高效率,特别是在需要对大型数据结构进行修改时,避免了复制整个对象。
    • 缺点:增加了代码的耦合度,因为调用者必须了解该参数可能会被改变;并且调用前必须明确初始化。
  4. 示例

    csharp 复制代码
    void IncreaseNumber(ref int num)
    {
        num += 10; // 直接修改传入的整数
    }
    
    int originalNum = 5;
    IncreaseNumber(ref originalNum);
    // 此时 originalNum 的值为 15

out 关键字

  1. 作用

    • 使用 out 关键字时,传递的参数在调用函数之前不必初始化,但在函数内部必须赋值。
    • 定义的方法负责初始化输出参数,调用者不需要知道初始值。
  2. 特点

    • 函数同样接收的是引用,但是强制要求函数内部至少有一次对该变量的赋值操作。
    • 调用函数后,输出参数必定会被赋予一个确定的值。
  3. 优缺点

    • 优点:适合用于函数返回多个结果的情况,或者在不知道输入值的情况下需要函数提供计算出的结果。
    • 缺点:可能使函数接口显得复杂,因为调用者需要为未初始化的变量声明额外的存储空间,并且通常与错误处理结合使用来表示"尝试获取结果"的逻辑。
  4. 示例

    csharp 复制代码
    bool TryParseInt(string input, out int result)
    {
        if (int.TryParse(input, out var parsedValue))
        {
            result = parsedValue; // 必须在这里或之前为result赋值
            return true; // 表示解析成功
        }
        else
        {
            result = 0; // 尽管不使用这个值,但仍需赋值
            return false; // 表示解析失败
        }
    }
    
    string strInput = "123";
    int parsedNumber;
    if (TryParseInt(strInput, out parsedNumber))
    {
        // 此时 parsedNumber 的值为 123
    }

总结起来,在Unity中,ref 主要用于传递可变参数并期望函数既能读又能写,而 out 则常用于从函数中返回单个或多个值,并且强调函数一定会提供一个有效的输出值。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)


​最后我们放松一下眼睛

相关推荐
Duo1J16 小时前
【UE】Slate 编辑器工具开发03 - 节点编辑器 (EdGraph)
ue5·编辑器·游戏引擎·ue4
郝学胜-神的一滴17 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
暗暗别做白日梦18 小时前
Pulsar 消息同步机制
c#·linq
海盗123418 小时前
微软技术周报——2026-07-22
microsoft·c#·.net
海盗123418 小时前
微软技术日报 ——2026-07-21
microsoft·c#·.net
-银雾鸢尾-18 小时前
C#中的泛型约束
开发语言·c#
WWJA王文举18 小时前
单片机参数如何掉电保存:Flash、EEPROM和配置存储完整设计
数据库·stm32·mongodb·c#
LONGZETECH19 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
丁小未20 小时前
Unity 几种常见合批手段的要求
游戏·unity·合批·srpbatcher·动态合批·静态合批
czhc114007566320 小时前
722:零侵入;DBG;
c#