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)


​最后我们放松一下眼睛

相关推荐
成都易yisdong14 分钟前
纬地、鸿业、海地、CASS等横断面数据互转工具V3.2——测绘与道路设计人员的效率神器
c#·visual studio code
AIKZX4 小时前
西门子博途 TIA Portal v18 中文版图文安装教程(超级详细)附下载链接
开发语言·c#·编辑器·idea
xiaoshuaishuai86 小时前
C# 数字资源分发
开发语言·c#
XiaoZhangGOGOGO7 小时前
《剑来2》动画第二季点映百度网盘提取码_百度网盘提取码资源
unity
格林威7 小时前
面阵相机 vs 线阵相机:堡盟与Basler选型差异全解析 +C# 实战演示
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
惊鸿醉8 小时前
基于Kinect SDK的Unity艺术交互展项——完整技术方案
unity
少控科技8 小时前
小数典 - V1.0.0.1
windows·c#
格林威8 小时前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附C# 实战演示
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
刘~浪地球9 小时前
日志平台架构设计
c#·linq
玖笙&9 小时前
✨WPF编程进阶【9.1】:WPF资源完全指南(附源码)
c++·c#·wpf·visual studio