• C#:in、out、ref关键字


    一、in关键字

    in 关键字会导致按引用传递参数,但确保未修改参数。 它让形参成为实参的别名,这必须是变量。从C++角度来说,in关键字有点类似于const T&

    1.in修饰值类型

    1)当in修饰基本数据类型时,我们无法修改基本数据类型的值,只能读取。

    1. void SetValue(in int i)
    2. {
    3. i = 4;//报错
    4. }

    2) 当修饰struct数据类型的时候也是只能读取。

    1. public struct ValueType
    2. {
    3. public int i;
    4. public void Set()
    5. {
    6. i = 1;
    7. }
    8. }
    9. public class ReadOnlyTest : MonoBehaviour
    10. {
    11. ValueType valueType = new ValueType();
    12. void Seti2(in ValueType valtype)
    13. {
    14. valtype.i = 4;//报错
    15. }
    16. }

     

    2.in修饰引用类型

    引用类型就比较灵活了,其是可以修改引用类型的成员变量的值的。

    1. public class RefType
    2. {
    3. public int i = 0;
    4. }
    5. public class ReadOnlyTest : MonoBehaviour
    6. {
    7. RefType refType = new RefType();
    8. void Seti1(RefType reftype)
    9. {
    10. reftype.i = 4;//可以正常修改
    11. }
    12. }

    3.在函数中使用in关键字可以算是重载的。

    1. void SetValue(in int i)
    2. {
    3. Debug.Log(i);
    4. }
    5. void SetValue(int i)
    6. {
    7. Debug.Log(i);
    8. }
    9. void Start()
    10. {
    11. SetValue(i);
    12. SetValue(in i);
    13. }

    该部分参考自:in 参数修饰符 - C# 参考 | Microsoft Docs

    二、out关键字

    out关键字跟in很像,基本像是一对。不过对out关键字来说其不仅可以读取,还能被赋值,同时也必须被赋值。

    1. void SetValue(out int i)
    2. {
    3. i = 9;
    4. int k=i;
    5. }
    6. void Start()
    7. {
    8. int i = 0;
    9. SetValue(out i);
    10. Debug.Log(i);//将打印9
    11. }

    三、ref关键字

    1.官方的提示

    1) 在某些情况下,按引用访问值可避免潜在的高开销复制操作,从而提高性能。

    2)不要混淆通过引用传递的概念与引用类型的概念。 这两种概念是不同的。 无论方法参数是值类型还是引用类型,均可由 ref 修改。 当通过引用传递时,不会对值类型装箱。

    2.ref修饰值类型

    ref主要对值类型会有较大的影响,其修饰函数形参与in和out没有很大区别。

    但是比较有趣的是其可以直接修饰变量。这真就跟C++的左值引用一模一样了。

    1. void Start()
    2. {
    3. int i = 0;
    4. ref int k = ref i;
    5. k = 3;
    6. Debug.Log(i);//i=3
    7. }

    并且还可以跟readonly关键字一起使用

    1. void Start()
    2. {
    3. int i = 0;
    4. ref readonly int k = ref i;
    5. k = 3;//只可读,不可赋值,报错
    6. Debug.Log(i);
    7. }

    3.ref、in、out关键字的区别

    1)传递到 ref 或 in 形参的实参必须先经过初始化,然后才能传递。 该要求与 out 形参不同,在传递之前,不需要显式初始化该形参的实参。

    该部分参考自:ref 关键字 - C# 参考 | Microsoft Docs

  • 相关阅读:
    nodejs(一)fs模块(操作文件的模块),path路径模块,路径拼接path.join,抵消两层路径的写法,浏览器中的js
    SpringBoot-7-对Web开发静态资源的处理
    MySQL题外篇【ORM思想解析】
    Maven
    第二章、数据结构和算法9分
    一篇博文,带你入门数据库SQL语言
    算法之美阅读笔记
    CIKM 2022 | HGANDTI: 药物-靶点相互作用预测的异构图注意网络
    HTML5期末考核大作业——学生网页设计作业源码HTML+CSS+JavaScript 中华美德6页面带音乐文化
    NSSCTF做题(7)
  • 原文地址:https://blog.csdn.net/qq_42987967/article/details/125932760