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)


​最后我们放松一下眼睛

相关推荐
red_redemption32 分钟前
自由学习记录(23)
学习·unity·lua·ab包
hccee2 小时前
C# IO文件操作
开发语言·c#
广煜永不挂科4 小时前
Devexpress.Dashboard的调用二义性
c#·express
/**书香门第*/4 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
初九之潜龙勿用6 小时前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
吾与谁归in8 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in8 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
神仙别闹9 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
向宇it18 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
九鼎科技-Leo19 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf