ref,in,out
ref,in,out
// 不能将in,ref,out关键字用于以下方法:
//异步方法,通过使用async修饰符定义
//迭代器方法,包括yield return 或yield break语句
//扩展方法的第一个参数不能有in修饰符,除非该参数是结构
//扩展方法的第一个参数,其中该参数是泛型类型
- ref
// ref 和In类似,但是参数是可以修改的 // 1.用于将变量传递给方法,并允许该方法更改变量的值, // 2.使用ref关键字可以把变量作为指针传递,从而在方法内部对其修改 public class RefClass { public static unsafe void Init() { //int num; //报错 // 使用ref时的参数必须初始化并赋值 int num = 10; Increment(ref num); int a = 1; ref int c = ref a; Console.WriteLine(c); c = 12; Console.WriteLine(c); // 方法内部的改变,方法外面的参数也会改变 Increment(ref c); Console.WriteLine(c); // 所有引用类型都是指针的包装器,因此通过引用类型标记为ref,可以将该类型视为指针,对其操作 string value = "zhangsan"; string* pValue = &value; MethodTest(ref *pValue); } static void Increment(ref int x) { x++; // ref表示用于返回一个变量的引用 Console.WriteLine(x); } static ref int IncrementArrayRef(int[] array) { return ref array[0]; } //static ref int IncrementNumRef(ref int num) //{ // // 返回值不能是null,常量,必须是变量 // // 返回值不能是方法内部定义的局部变量,可用的返回值可以来自静态字段,ref修饰的方法参数,数组参数的成员等 // //return ref num++; //} /// <summary> /// ref 表示指定该方法的参数是一个引用类型 /// </summary> /// <param name="str"></param> /// <returns></returns> static ref string MethodTest(ref string str) { // ref表示用于返回一个变量的引用 Console.WriteLine(str); return ref str; } }
- in
- 允许参数以引用传递的方式给到方法中,本参数只能读取,不能赋值
// in 会导致按引用传递参数,但确保未修改参数(无法通过调用的方法进行修改) int num = 1; string underFindStr; void InUnderFindTest(in string underFindStr) { Console.WriteLine(underFindStr); } void InTest(in int num) { Console.WriteLine(num); //只读变量,不能修改,报错 //num = 1; }
- 允许参数以引用传递的方式给到方法中,本参数只能读取,不能赋值
- out
- 允许参数以引用传递的方式给到方法中,进入方法后,参数值被清空,必须重新赋值后使用
// result可不赋值,但是用之前必须赋值 如 result=result +2 会报错 // out 和In类似,但参数必须由调用方的方法进行修改 void OutTest(out int result, int a, int b) { result = a + b; Console.WriteLine(result); }
- 允许参数以引用传递的方式给到方法中,进入方法后,参数值被清空,必须重新赋值后使用
本文作者:乐天--
本文链接:https://www.cnblogs.com/blackamon/p/17611160.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步