C# 中的 ref 和 out 的意义和使用方法

简介:

原文C# 中的 ref 和 out 的意义和使用方法

 

  向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如 int),可空类型(int?),还是引用类型,这一点都是成立的。也就是随便在方法内部进行什么修改,都不会影响实参的值。例如,对于引用类型,方法的改变,只是会改变引用的数据,但实参本身并没有变化,它仍然引用同一个对象。

        代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using  System; 
using  System.Collections.Generic; 
using  System.Linq; 
using  System.Text; 
   
namespace  ref_out 
     class  Program 
    
         static  void  Main( string [] args) 
        
             int  i = 8; 
             Console.WriteLine(i); 
             DoIncrease(i); 
             Console.WriteLine(i); 
        
   
         static  void  DoIncrease( int  a) 
        
             a++; 
        
    

 

  运行结果如下:

      若使用 ref 关键字,向形参应用的任何操作都同样应用于实参,因为形参和实参引用的是同一个对象。

  PS:实参和形参都必须附加 ref 关键字做为前缀。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using  System; 
using  System.Collections.Generic; 
using  System.Linq; 
using  System.Text; 
   
namespace  ref_out 
     class  Program 
    
         static  void  Main( string [] args) 
        
             int  i = 8; 
             Console.WriteLine(i);    // 8 
             DoIncrease( ref  i);       // 实参前也必须加 ref 
             Console.WriteLine(i);    // 9 // ref 关键字使对形参的动作也应用于实参 
        
   
         static  void  DoIncrease( ref  int  a)    // 形参前必须加 ref 
        
             a++; 
        
    

 

 运行结果如下

ref 实参使用前也必须初始化,否则不能通过编译。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using  System; 
using  System.Collections.Generic; 
using  System.Linq; 
using  System.Text; 
   
namespace  ref_out 
     class  Program 
    
         static  void  Main( string [] args) 
        
             int  i;           // ref 实参没有初始化,所以程序不能通过编译 
             Console.WriteLine(i); 
             DoIncrease( ref  i); 
             Console.WriteLine(i); 
        
   
         static  void  DoIncrease( ref  int  a) 
        
             a++; 
        
    

 

有时我们希望由方法本身来初始化参数,这时可以使用 out 参数

代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using  System; 
using  System.Collections.Generic; 
using  System.Linq; 
using  System.Text; 
   
namespace  ref_out 
     class  Program 
    
         static  void  Main( string [] args) 
        
             int  i;     // 没有初始化 
             //Console.WriteLine(i); // 此处 i 未初始化,编译错误 
             DoIncrease( out  i);   // 用方法来给实参赋初值 
             Console.WriteLine(i); 
        
   
         static  void  DoIncrease( out  int  a) 
        
             a = 8;   // 在方法中进行初始化 
             a++;     // a = 9 
        
    

 

 

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5948021.html ,如需转载请自行联系原作者


相关文章
|
2月前
|
C#
C#系列之ref和out的区别
C#系列之ref和out的区别
|
9月前
|
存储 C# C++
从C++角度讲解C#Out和ref的区别
从C++角度讲解C#Out和ref的区别
|
8月前
|
C#
C#中out和ref之间的区别
C#中out和ref之间的区别
|
10月前
|
C#
C#基础⑧——方法(函数、重载、out、ref)
比喻成职能。比喻成一个生产自行车老板,一个地方专门放螺丝,一个地方专门放轮,一个地方专门放车链子,需要组装什么就从那个仓库里面拿就行了。各司其职。
|
关系型数据库 MySQL C#
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
95 0
【C#】【MySQL】【GridView】删除出现Parameter index is out of range
C# ref out的使用与区别
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。Ref型参数引入前必须赋值。 out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。 Out型参数引入前不需赋值,赋值也没用。
125 0
C# ref out的使用与区别
|
存储 C# C++
C#基础知识 之 ✨ ref 和 out 之间的江湖趣闻
引用参数和输出参数 按照国际惯例,要了解一个东西的时候,首先明白它是什么,然后明白它能做什么,最后要知道为什么。 所以在介绍ref和out之前要先简单了解一下什么是引用参数与输出参数,因为使用ref和out要有所了解
C#基础知识 之 ✨ ref 和 out 之间的江湖趣闻
|
.NET C# 开发框架
[C#]浅析ref、out参数
转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事,再把值类型和引用类型给参杂进来的话就变得更加让人头晕了。
969 0
|
20天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
20天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。