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关键字一定要在内部初始化。(实参外部有没有初始化不影响)。

相关文章
|
5月前
|
C#
C#学习相关系列之yield和return的区别
C#学习相关系列之yield和return的区别
|
4月前
|
存储 安全 Java
程序与技术分享:C#值类型和引用类型的区别
程序与技术分享:C#值类型和引用类型的区别
33 0
|
1月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
62 5
|
2月前
|
C#
C#中的overload,overwrite,override的语义区别
以上概念是面向对象编程中实现多态性和继承的重要基石。理解它们之间的区别对于编写清晰、可维护的代码至关重要。
72 7
|
2月前
|
C# 计算机视觉
C#中out关键字
C#中out关键字
43 0
|
2月前
|
编译器 C# 计算机视觉
C#中的ref关键字
C#中的ref关键字
36 0
|
5月前
|
C#
c#一文读懂continue、return、break区别
c#一文读懂continue、return、break区别
41 0
|
5月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
168 3
|
5月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
181 3
|
9天前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
24 2