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

//#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
------------------------------------
 

时间: 2024-10-11 07:07:15

c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别的相关文章

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

以下是对c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区进行了详细的分析介绍,需要的朋友可以过来参考下   复制代码 代码如下: #define Test using System; namespace Wrox.ProCSharp.ParameterTestSample ...{  class ParemeterTest  ...{     static void TestInt(int[] ints,int i)     ...{         ints[0] = 10

SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法

1.SpringMVC中通过@ResponseBody返回对象,作为JQuery中的ajax返回值 package com.kuman.cartoon.controller;   import java.util.Map;   import javax.servlet.http.HttpServletRequest;   import org.apache.commons.io.filefilter.FalseFileFilter; import org.slf4j.Logger; import

* java 中的数组 对象数组 以及main方法中的参数 x y不用中间参数实现交换

 /*  java 中的数组  对象数组   以及main方法中的参数    x y不用中间参数实现交换java 基本数据类型 的数组 初始化元素为 0java中数组名.length表示数组中元素的个数 main方法中的 args[] 从0开始 是java 类  后面的字符串  args.length也是保存了 元素的个数 System.out.println()  在打印对象的时候 包括我们自己定义的对象 他会调用toString方法 因为所有类都是从object派生而来  打印出类测描述建议

关于在同控制器中方法中调用没有权限的方法的提问

问题描述 关于在同控制器中方法中调用没有权限的方法的提问 Index 控制器中,我写了一个有权限的A方法,然后我又写了一个我没有权限B方法,当我在A方法中用 $this->B(); 时,居然在A方法中能够接收到 B中 return 出来的值 跪求解答 解决方案 YII 如何在控制器里调用 model 方法YII 如何在控制器里调用 model 方法

bat命令修改xml文件中某个参数的值

问题描述 bat命令修改xml文件中某个参数的值 用的下面的方法 set filename=C:UsersAdministratorDesktopccms_install_x86_windows_s1.0.3conftest2.xml set oldstr=pylGLZ set newstr=C:UsersAdministratorDesktopccms_install_x86_windows_s1.0.3upload setlocal enabledelayedexpansion for /f

在JS方法中返回多个值的方法汇总

  本文给大家汇总了在javascript方法中返回多个值的方法,都是在个人项目中检验过的,这里推荐给大家,有需要的小伙伴可以参考下. 在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <html> <head> <title>JS函数返回多个值</title> <

选择-如何在一个方法内返回UTF-8格式的字符串,在另一个方法中调用输出?

问题描述 如何在一个方法内返回UTF-8格式的字符串,在另一个方法中调用输出? package com.secutiry.rsa;import java.util.Scanner;public class Prtest { public String Phintx(){ Scanner cc =new Scanner(System.in); //下马这行会报错,选择try catch 或者 throw declaration //选择try catch 则无法return 选择throw dec

axis2发布webservice-spring注入的问题,set方法会调用并且有值,但是调用后变成null值

问题描述 spring注入的问题,set方法会调用并且有值,但是调用后变成null值 我用set方法注入,用axis2发布了webservice,在服务启动的时候,相应的set方法会注入进去,但是当我调用方法的时候,本来注入到方法里的属性就会变成了null. 配置文件 就是一层一层的注入的 <!-- 创建SqlSessionFactory,同时指定数据源--> <bean id="sqlSessionFactory" class="org.mybatis.s

spring mvc aop获取controller中的方法中的参数名称

问题描述 spring mvc aop获取controller中的方法中的参数名称 //配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点 //"execution(* com.nong.aop.*.controller..*.*(..))" /*@Pointcut("execution(* com.nong.aop.*.controller.*(..))") public void aspect(){} // 配置前置通知,使用在方法aspe