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)


​最后我们放松一下眼睛

相关推荐
地狱为王21 分钟前
Unity使用AnimeGANv3实现动漫风格化效果(二)
unity·游戏引擎
fcm1922 分钟前
unity之线框模式
unity·游戏引擎
unity工具人26 分钟前
unity DoTween DoPath设置物体按照指定轨迹运动
unity·游戏引擎
程序猿阿伟30 分钟前
《风格锚点+动态适配:Unity跨设备渲染的核心逻辑》
unity·游戏引擎
倚剑仙10 小时前
Unity-WebGL开发——用IIS(Internet Information Services)部署webGL工程
unity·游戏引擎·webgl
未孤_有青山15 小时前
库卡机器人通讯-EtherKRL-XML格式
xml·c#
課代表16 小时前
VB.NET 与 C# 文件操作文本到二进制文件的读写
c#·二进制文件·vb.net·streamwriter·文本文件·读写·streamreader
我是唐青枫16 小时前
C#.NET Cronos 实战:优雅解析与执行 Cron 表达式
c#·.net
还是大剑师兰特17 小时前
C#面试题及详细答案120道(41-50)-- 异常处理
c#·大剑师
baldr_439617 小时前
关于光照探针的实验和疑问
unity