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)


​最后我们放松一下眼睛

相关推荐
leo__5204 小时前
C#与三菱PLC串口通信源码实现(基于MC协议)
开发语言·c#
墨瑾轩6 小时前
C# PictureBox:5个技巧,从“普通控件“到“图像大师“的蜕变!
开发语言·c#·swift
墨瑾轩6 小时前
WinForm PictureBox控件:3个让图片“活“起来的骚操作,90%的开发者都踩过坑!
开发语言·c#
孟无岐9 小时前
【Laya】Socket 使用指南
websocket·typescript·游戏引擎·游戏程序·laya
Jackson@ML10 小时前
2026最新版Visual Studio安装使用指南
ide·c#·visual studio
tealcwu12 小时前
【Unity资源】Unity MCP 介绍
unity·游戏引擎
莫生灬灬12 小时前
VueMultiBrowser 5.0 开源 - 基于 Vue3 + CEF 的多浏览器管理器
chrome·开源·c#·自动化·多开·cef3
xb113213 小时前
C#异步编程入门概念及核心概念
开发语言·c#
晚霞的不甘14 小时前
Flutter for OpenHarmony 引力弹球游戏开发全解析:从零构建一个交互式物理小游戏
前端·flutter·云原生·前端框架·游戏引擎·harmonyos·骨骼绑定
gc_229915 小时前
学习C#调用OpenXml操作word文档的基本用法(19:学习文档页脚类)
c#·word·openxml·页脚·footerpart