C#系列之ref和out的区别

简介: C#系列之ref和out的区别

一.ref和out的作用

       在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out。(简单说ref和out可以使得方法可以返回多个返回值)

二、ref和out的区别

概述:

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

相同点:

1、都能返回多个返回值。

2、若要使用 ref 和out参数,则方法定义和调用方法都必须显式使用 ref和out 关键字。(也就是在定义和调用方法时参数前要有ref和out关键字)在方法中对参数的设置和改变将会直接影响函数调用之处(参数的初始值)。

不同点:

1、ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;

2、out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

口诀:

ref有进有出,out只出不进。

ref和out参数前一定要有关键字!!!!

三、代码示例

1.ref的错误使用,未在使用前对参数赋值!

纠正代码:

using System;
class prograss
{
    static void Main(string[] args)
    {
        //使用ref输出关键字对参数赋值
        int x=1;
        int y=1;
        prograss pg = new prograss();
        pg.getvalue(ref x, ref y);
        Console.WriteLine(x+" "+y);
        Console.ReadKey();
    }
    public void getvalue(ref int x, ref int y)
    {
        x = 1000;
        y = 100;
    
    }
}

输出结果:

2、out错误使用未在内部赋值

错误纠正:

using System;
class prograss
{
    static void Main(string[] args)
    {
        //使用out关键字进行赋值
        int m, n;
        pg.Setvalue(out m,out n);
        Console.WriteLine(m+" "+n);
        int u = 12;
        int p = 13;
        pg.Setvalue(out u, out p);
        Console.WriteLine(u + " " + p);
        Console.ReadKey();
    }
    public void Setvalue(out int a, out int b)
    {
        a = 123;
        b = 521;
        int temp = a;
        a = b;
        b = temp;
    
    }

输出结果:

四、总结

1.ref和out使用时候一定要在参数前加关键字。

2.ref是在外部初始化,内部不需要再初始化。

3.out关键字一定要在内部初始化。(实参外部有没有初始化不影响)。

相关文章
|
2月前
|
C#
C#学习相关系列之yield和return的区别
C#学习相关系列之yield和return的区别
|
2月前
|
C#
C#中IsNullOrEmpty和IsNullOrWhiteSpace的区别?
C#中IsNullOrEmpty和IsNullOrWhiteSpace的区别?
|
2天前
|
C#
c#一文读懂continue、return、break区别
c#一文读懂continue、return、break区别
7 0
|
5月前
|
Java C#
C# String与StringBuilder的区别和使用方法
C# String与StringBuilder的区别和使用方法
|
5月前
|
C# 数据库
C# 四种循环体的使用与区别
C# 四种循环体的使用与区别
|
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#打造高效应用。
|
20天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
20天前
|
人工智能 C# 开发者
C#编程中的图形界面设计
【4月更文挑战第21天】本文探讨了C#在GUI设计中的应用,介绍了Windows Forms、WPF和UWP等常用框架,强调了简洁界面、响应式设计和数据绑定等最佳实践。通过实际案例,展示了C#在企业应用、游戏开发和移动应用中的GUI实现。随着技术发展,C#在GUI设计的未来将趋向于跨平台、更丰富的组件和AI集成,为开发者创造更多可能性。
|
20天前
|
存储 算法 C#
C#编程与数据结构的结合
【4月更文挑战第21天】本文探讨了C#如何结合数据结构以构建高效软件,强调数据结构在C#中的重要性。C#作为面向对象的编程语言,提供内置数据结构如List、Array和Dictionary,同时也支持自定义数据结构。文章列举了C#实现数组、链表、栈、队列等基础数据结构的示例,并讨论了它们在排序、图算法和数据库访问等场景的应用。掌握C#数据结构有助于编写高性能、可维护的代码。