`
yanfaguanli
  • 浏览: 660142 次
文章分类
社区版块
存档分类
最新评论

C#中的传值 传引用

 
阅读更多

在C#中默认是按值传递,什么是按值传递呢?我们都知道,在参数传递过程中,形参和实参占有不同位置的存储空间,被调用过程在执行过程中,改变了形参的值,但不会影响调用过程(主调过程)的实参值。所以,当被调用过程执行结束返回到调用过程,实参还是调用之前的值。因此为了保护实参不受被调用过程的影响,应选用按值传递参数方式。

说理论有些抽象,让我用个简单的Swap函数给大家说明下吧。

class Program
    {
        static void Main(string[] args)
        {
            double a, b;
            Console.WriteLine("请输入第一个数字a");
            a = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入第二个数字b");
            b = Convert.ToDouble(Console.ReadLine());
            Swap(a, b);

            Console.WriteLine("主调用过程按值传递后a的值" + a);
            Console.WriteLine("主调用过程按值传递后b的值" + b);
            Console.Read();
        }
        static void Swap(double x, double y)
        {
            double temp;
            temp = x;
            x = y;
            y = temp;
            Console.WriteLine("被调用过程中a的值" + x);
            Console.WriteLine("被调用过程中b的值" + y);
        }
    }
输出结果:

通过结果可以发现,a、b的值只在被调用过程中发生改变,在回到主调用过程中后未发生改变。

接着说按引用传递。在C#中按引用传递需加上关键字ref。所谓按引用传递就是当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参和实参使用相同地址的内存单元。因此在被调用过程中改变形参的值,就等于改变了实参的值。

还是让我们用例子来说明问题吧。还是上面的例子,我稍加修改。

 class Program
    {
        static void Main(string[] args)
        {
            double a, b;
            Console.WriteLine("请输入第一个数字a");
            a = Convert .ToDouble ( Console.ReadLine());
            Console.WriteLine("请输入第二个数字b");
            b =Convert.ToDouble( Console.ReadLine());
            Swap(ref a,ref  b);

            Console.WriteLine("主调用过程按引用传递后a的值" + a);
            Console.WriteLine("主调用过程按引用传递后b的值" + b);
            Console.Read();
            
        }
        static  void Swap(ref double x, ref double y)
        {
            double temp;
            temp = x;
            x = y;
            y = temp;
            Console.WriteLine("被调用过程中a的值" + x);
            Console.WriteLine("被调用过程中b的值" + y);
        }
    }


输出结果:

只是多了个ref,结果就正好相反,这就是代码的神奇之处。

其实概括起来就一句话,按值传递,形参不改变实参;按引用传递,形参改变实参。

希望能对大家有帮助。

分享到:
评论

相关推荐

    in.ref.out C#传值调用与引用调用

    in.ref.out C#传值调用与引用调用

    C# winform窗体间传值(使用委托或事件)

    C#winform窗体间传值,三种方法示例,注释详细。使用方法:使用vs2013打开编译运行即可; 工程中总共介绍了三种方法: ###方法1:通过保存对象的引用调用其方法实现对子窗体的控制; ###方法2:通过委托,在子窗体...

    C#传值代码

    C#中教你如何传值,向方法传递参数的方法有两种:传值和传参数。传值时,被调用的方法将接受参数值的一个副本,若方法对副本进行修改,不会影响原始变量值。若传引用相当于允许方法直接访问和修改调用者的原始数据。...

    c# winform实例 锐浪报表动态传值创建明细表格 demo

    c# winform实例 锐浪报表动态传值创建明细表格 demo 注意需要安装锐浪报表客户端 注意引用grdes6.dll

    C#调用C++ Dll关于结构体数组引用的传递及解析使用的展示代码

    资源代码演示的是c#代码调用c++ DLL 的方式。该演示为原创,绝非搬砖。解决了c# 调用 C++ Dll获取相关信息之如何传递结构体数组引用以及如何处理获取到的结构体数组数据的问题。

    C#中的值传递和引用传递详细解析

    本篇文章主要是对C#中的引用传递与值传递进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    C# WPF 通过委托实现多窗口间的传值的方法

    主要介绍了C# WPF 通过委托实现多窗口间的传值的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    c# 程序设计英文课件

    传值调用与传引用调用 数据转换与类型转换 一维数组、均匀数组、非均匀数组 属性、事件、索引器的定义和使用 异常对象的生成、抛出和捕捉 方法的隐藏和覆盖 接口与显式接口定义 抽象类和抽象方法 常用控件的重要属性...

    浅析C# 函数的传值与传址

     上面说的就牵扯到数据的分类,分为值类型和引用类型,值类型的就是传值的那种,引用类型包括字符串类型,数组和对象,字符串类型特殊,主要是因为字符串实际上是一个字符char[]数组,它在修改的时候并不是直接修改...

    c#基础系列之ref和out的深入理解

    本文中说的Ref和Out都是引用传递,Ref的重点是把值传给调用方法,Out则是得到调用方法的值,类似于有返回类型的方法返回的值; 在使用两者时一定要注意一下两点,否则编译出现错误 a) ref 变量使用前要先声明同时要...

    C# 常用算法C# 常用算法

    传值调用与引用调用 递归求阶乘 使用接口排序(1) ......

    SliverLight跨页面传值并调用WCF的例子

    SliverLight跨页面传值并调用WCF的例子,分多窗口协同工作,对象存储,DataGrid显示

    JSP中调用js日期控件

    JSP中调用js日期控件,非常方便简单实用.可以加快开发速度.

    C# ref和out的区别

    在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像...

    C#编程经验技巧宝典

    111 <br>0184 如何在ASP.NET中获取文件的扩展名 111 <br>0185 如何在ASP.NET中用URL在页面之间传值 112 <br>0186 如何使用IsPostBack实现ASP.NET页面加载 112 <br>0187 如何利用输出缓存技术缓存...

    c#学习笔记——学习心得

    C#中的各种名词: 常数:声明时用const修饰,是隐式静态类型 域:一个代表和某对象或类相关的变量的成员 字段:和属性相同,是用来存储对象的值,可以直接访问数据且不能对数据添加任何限制,但是属性不能且可以对...

    毕业设计成品C#智能化企业人事管理系统实战课程PPT模板.pptx

    dotnetbar控件的引用登录窗体界面设计过程 毕业设计成品C#智能化企业人事管理系统实战课程PPT模板全文共24页,当前为第4页。 登录功能的实现sqldatareader和sqlhelper的使用 毕业设计成品C#智能化企业人事管理系统...

    pc 调用bat 及传递参数给bat文件

    pc 调用bat 及传递参数给bat文件

    C#引用类型作为方法的参数分析

    主要介绍了C#引用类型作为方法的参数分析,以实例的形式较为详细的分析了参数的传值问题,需要的朋友可以参考下

    bartender C# SDK

    支持bartender 10.1打印的控制,Visual Studio在引用中引用此dll文件,变可以在代码中使用BarTender.Application进行打印,打印通过嵌入数据的名称进行传值。 下面两个博客教你如何让浏览器去控制bartender打印: ...

Global site tag (gtag.js) - Google Analytics