Unity ref 和out、 params的使用

本文深入讲解C#中的ref、out和params参数的使用场景及区别,通过Unity实例演示如何利用这些参数特性提升代码效率。

相信很多刚接触C#或者unity的同学,都会看到很多这样那样的函数,带有ref ,out 或者params的参数,今天我就来讲一讲这三者的使用和区别:

ref

直接来看看实现的代码

  public void UpdateScore(ref int  score)
    {
        score = UnityEngine.Random.Range(80, 100);
    }

我使用unity在start里面调用测试

   void Start()
    {
        int myscore = 60;
        UpdateScore(ref myscore);
        print(myscore);



    }

看看打印结果:

有C语言或者C++基础的同学可能看出来了,这不就像C语言的指针变量吗?是的,这跟指针变量差不多,其实这是C#的参数引用传递,在方法中对参数所做的任何更改都将反映在该变量中

什么时候使用ref关键字呢

我理解:有时候我们不需要执行完这个方法就可以改变参数的值,或者想要改变的参数值比较多的时候

out

看看代码实现:

 public void GetScore(out int score)
    {
        score = UnityEngine.Random.Range(80, 100);
    }

调用

    void Start()
    {
        int score;
        GetScore(out score);
        print(score);



    }

结果:

其实out跟ref编译原理是一样的,区别就是ref需要先初始化值,而out不需要,总结起来就是ref 有进有出,out只出不进

out什么时候使用呢

我理解:用在没有返回值的函数就能返回值,例如在返回值是void的函数就能返回,还有就是我们经常使用的都是返回一个值的,那么我们如果想在一个函数中返回多个值呢?那么out就起作用了,我们可以使用out返回多个值

 

params

看看代码实现

   public void Getdd(params int[] pp)
    {
        foreach (var p in pp)
        {
            print(p);
        }
    }

调用

   void Start()
    {
       Getdd(1,2,3);



    }

结果:

是不是感觉有些不同,我们以往传递数组的时候,是不是不是这样传递的,params是为动态数组而准备的,我们直接输入数组的元素就行了,如果不加params,我们只能这样调用

    public void Getdd( int[] pp)
    {
        foreach (var p in pp)
        {
            print(p);
        }
    }

 void Start()
    {
       Getdd(new []{1,2,3});
    }

希望大家好好理解一下,也可以多看看unity系统函数,加深理解,这一篇完毕,如果对大家有用,关注或者点赞我

 

 

在Windows平台上使用Unity显示蓝牙设备,可以通过调用Windows的API来实现。以下是一个基本的步骤指南: 1. **引入必要的命名空间**:首先,你需要在Unity脚本中引入Windows的System.Runtime.InteropServices命名空间,以便可以调用Windows的原生API。 ```csharp using System.Runtime.InteropServices; ``` 2. **声明API函数**:声明需要调用的Windows API函数。例如,可以声明`BluetoothFindFirstDevice`函数用于开始枚举蓝牙设备。 ```csharp [DllImport("Irprops.cpl", SetLastError = true)] private static extern IntPtr BluetoothFindFirstDevice(ref BLUETOOTH_DEVICE_SEARCH_PARAMS pbtsp, out BLUETOOTH_DEVICE_INFO pbtdi); ``` 3. **设置搜索参数**:定义蓝牙设备搜索参数,如设备地址等。 ```csharp BLUETOOTH_DEVICE_SEARCH_PARAMS searchParams = new BLUETOOTH_DEVICE_SEARCH_PARAMS(); searchParams.fReturnAuthenticated = true; searchParams.fReturnRemembered = true; searchParams.fReturnUnknown = true; searchParams.fReturnConnected = true; searchParams.fReturnRemembered = true; searchParams.fReturnLoaded = true; searchParams.fIssueInquiry = true; ``` 4. **枚举设备**:使用`BluetoothFindFirstDevice`等函数枚举设备,并遍历这些设备。 ```csharp IntPtr handle = BluetoothFindFirstDevice(ref searchParams, out BLUETOOTH_DEVICE_INFO deviceInfo); if (handle != IntPtr.Zero) { // 枚举设备 do { // 使用deviceInfo结构体中的数据(比如设备名称) Console.WriteLine("Found Device: " + deviceInfo.szName); } while (BluetoothFindNextDevice(handle, out deviceInfo)); // 关闭句柄 BluetoothFindDeviceClose(handle); } ``` 5. **清理**:在完成设备搜索后,释放分配的资源。 ```csharp BluetoothFindDeviceClose(handle); ``` 注意:上述代码中使用的API结构体(如`BLUETOOTH_DEVICE_SEARCH_PARAMS``BLUETOOTH_DEVICE_INFO`)是假设存在的示例,实际上你需要根据Windows API文档定义正确的结构体函数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值