C# 中的 ref 和 out 的意义和使用方法-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

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,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9497 0
使用outlet在SAP Spartacus中添加自定义UI
使用outlet在SAP Spartacus中添加自定义UI
12 0
ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置和初始化数据库,以及如何创建迁移代码和应用迁移代码。
1460 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10844 0
Android下DrawerLayout的使用
Android下DrawerLayout的使用 DrawerLayout见名知意,就是一个具有抽屉效果的布局,看看这个效果图,是不是感觉很炫酷 这么炫的效果其实不一定非要用类似一些SlidingMenu这样的框架才能实现,原生库就有对这种效果的支持,今天我们就一起来学习一下DrawerLayout的使用。
937 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13186 0
Android下DrawerLayout的使用
Android下DrawerLayout的使用 DrawerLayout见名知意,就是一个具有抽屉效果的布局,看看这个效果图,是不是感觉很炫酷 这么炫的效果其实不一定非要用类似一些SlidingMenu这样的框架才能实现,原生库就有对这种效果的支持,今天我们就一起来学习一下DrawerLayout的使用。
853 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载