C#之out与ref的共性与区别以及用法
undefinedundefined
引入:
首先看一个例子:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int number = 10; 6 int result = Test(number); 7 Console.WriteLine("number={0},result={1}", number, result); 8 Console.ReadKey(); 9 } 10 11 static int Test(int a) 12 { 13 a = 20; 14 return a; 15 } 16 }
此时,显然得到number=10,a=20;把number传给方法Test中的a,在方法number中改变a的值,number的值并不会发生改变。
然后我们做如下改变
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Program { static void Main( string [] args) { int number; int result = Test(number); //此处会报错“使用了未赋值的局部变量‘number’” Console.WriteLine( "number={0},result={1}" , number, result); Console.ReadKey(); } static int Test( int a) { a = 20; return a; } } |
显然变量没有赋值就使用是错误的
现在我们使用out代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Program { static void Main( string [] args) { int number; int result = Test( out number); //注意调用时也需要加out Console.WriteLine( "number={0},result={1}" , number, result); Console.ReadKey(); } static int Test( out int a) { a = 20; //若方法中参数标有out,一定对a先进行赋值才可以使用。 return a; } } |
此时结果为number=20,result=20;一旦使用out,a就不是往方法里传值而是往外返回值。
不再是把number的值赋给a了,而是把number与a建立起一种联系,在方法Test中必须对a进行赋值,对a进行赋值后就相当于对number进行赋值(即把number的引用传递给a)
out总结:
1.在方法的参数前加out,那么在传参数的时候也必须在参数前使用out,以表明此参数并不是用来传入而是用来传出值的。
2.如果参数是以out形式传入的,那么在传入不能对其进行赋值。
3.在方法中对于用out修饰的参数,必须对其赋值,且必须在其使用前进行赋值。
ref:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Program { static void Main( string [] args) { int number = 10; int result = Test( ref number); //注意调用时也需要加ref Console.WriteLine( "number={0},result={1}" , number, result); Console.ReadKey(); } static int Test( ref int a) { int b = a;<br> a=20; return b; } } |
此时结果为:number=20,result=10;此时把number的值传入了方法Test,并且变量b使用了,然后对a进行赋值20,并且传了出去。
即ref既可以传入参数也可以传出参数。
总结ref与out
out用于传入值,ref是双向的既可以传入又可以传出。(其原理为引用类型传递与值类型传递,不使用out与ref时为值类型传递,使用时为引用类型传递)
在传参数的过程中如果有ref与out修饰,那么改变方法中参数变量的值,也会改变使用者方法中变量的值。
out的使用实例
1.微软提供了一个int类型的方法
int.TryParse(string s,out int result)
首先解释一下这个方法
该方法的返回值为bool型。即转换成功返回true,转换失败返回false;同时转换成功会返回一个result,result的值即为转换后的值,转换失败result则为null
下面我们自己写一个方法实现这个功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Program { static void Main( string [] args) { string s = "123" ; int result; if (ConvertInt(s, out result)) { Console.WriteLine( "转换成功" + result); } else { Console.WriteLine( "转换失败!" ); } Console.ReadKey(); } static bool ConvertInt( string s, out int result) { try { result = Convert.ToInt32(s); return true ; } catch { result = 0; //注意此处,必须对out修饰的参数result赋值 return false ; } } } |
可在需要返回多个值时使用out与ref。
可以使用如下实例练手!
对一个数组元素求和并返回和与数组元素的最大值和最小值
作者: 随心所于
出处:https://www.cnblogs.com/hunternet/p/4695093.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
微信公众号:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述