c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析

时间:2023-04-07 03:43:25 


#define Test

using System;

namespace Wrox.ProCSharp.ParameterTestSample
...{

 class ParemeterTest
 ...{
    static void TestInt(int[] ints,int i)
    ...{
        ints[0] = 100;
        i = 100;
    }

     static void TestInt(int[] ints, ref int i)
     ...{
         ints[0] = 200;
         i = 200;
     }

     static void TestInt2(int[] ints, out int i)
    ...{
        ints[0] = 300;
        i = 300;
    }

 
    public static void Main()
    ...{
        int i=0;
        int[] ints = ...{0,1,2,3,4};

        Console.WriteLine("-----------TestInt------------------");

        Console.WriteLine("i={0}",i);
        Console.WriteLine("ints[0]={0}",ints[0]);
        Console.WriteLine("------------------------------------");

        //默认情况下,c#所有参数都是通过值引用的,所以值类型i在上面的函数调用时,传送的只是一个副本,函数只是在调用过程中影响了副本的值,对i值实际并没有影响
        TestInt(ints, i);

        Console.WriteLine("i={0}",i);//这里输出的i值仍然是0
        Console.WriteLine("ints[0]={0}",ints[0]);
        Console.WriteLine("------------------------------------");

        //如果要改变i的值,可以用ref让参数i通过引用传送给函数
        TestInt(ints, ref i);

        Console.WriteLine("i={0}",i);//这里输出的i值为200
        Console.WriteLine("ints[0]={0}",ints[0]);
        Console.WriteLine("------------------------------------");

        //要改变i的值,也可以通过out关键字让
        TestInt2(ints, out i);

        Console.WriteLine("i={0}", i);//这里输出的i值为300
        Console.WriteLine("ints[0]={0}", ints[0]);
        Console.WriteLine("------------------------------------");

        //ref与out很相似,但有也区别,ref必须要求参数初始化,out则不需要
        #if Test//要测试下面的二行,把代码第一行#define Test去掉注释即可
            int j;       
            SomeFunction(ints, ref j);//编译时会报错: 使用了未赋值的局部变量“j”
        #endif

        int k;
        TestInt2(ints, out k);
        Console.WriteLine("k={0}", k);
        Console.WriteLine("------------------------------------");       

        Console.ReadLine();
    }
 }

 
}

运行结果;
-----------TestInt------------------
i=0
ints[0]=0
------------------------------------
i=0
ints[0]=100
------------------------------------
i=200
ints[0]=200
------------------------------------
i=300
ints[0]=300
------------------------------------
k=300
------------------------------------

标签:c#,参数值传递方式,引用传递方式
0
投稿

猜你喜欢

  • Spring Security登录添加验证码的实现过程

    2021-07-25 23:47:17
  • 关于Java实现HttpServer模拟前端接口调用

    2021-07-10 07:44:17
  • C#中使用快速排序按文件创建时间将文件排序的源码

    2023-06-04 08:19:19
  • Android WebView使用的技巧与一些坑

    2022-10-18 12:57:23
  • C#多线程Thread使用示例详解

    2021-11-12 06:52:05
  • C# Socket 发送&接收&返回 简单应用实例

    2022-09-18 20:08:20
  • 详解Java中HashSet和TreeSet的区别

    2022-01-17 09:47:47
  • 详解Java线程池如何统计线程空闲时间

    2022-11-09 07:41:10
  • emoji表情与unicode编码互转的实现(JS,JAVA,C#)

    2023-02-07 06:07:48
  • Android Studio 3.0后出现AAPT2与“android.enableAapt2”问题的解决方法

    2021-08-28 20:29:54
  • java解析json数组方式

    2023-08-10 17:22:14
  • Java 添加超链接到 Word 文档方法详解

    2023-01-29 08:49:30
  • C#添加、获取、删除PDF附件实例代码

    2023-06-23 11:41:46
  • C# DataSet查看返回结果集的实现

    2021-10-10 09:54:31
  • Jackson序列化和反序列化忽略字段操作

    2022-08-29 14:01:14
  • 基于mybatis逆向工程的使用步骤详解

    2022-10-28 09:27:26
  • Java多线程事务管理的实现

    2023-07-26 22:58:20
  • 如何设置Spring Boot测试时的日志级别

    2023-11-10 14:11:20
  • Android购物分类效果实现

    2021-09-20 02:04:10
  • Java 中责任链模式实现的三种方式

    2023-11-08 14:32:31
  • asp之家 软件编程 m.aspxhome.com