• 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
    ------------------------------------
     


    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    ES6(四)字符串的扩展
    ES6(三)数组的扩展
    ES6(二) Destructuring-变量的解构赋值
    ES6(一) let and const
    canvas(七) 文字编写
    canvas(五)createPattern
    canvas(四) Gradient- demo
    canvas(三) star- demo
    jQuery之简单动画效果
    web开发小白之路
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/988590.html
Copyright © 2020-2023  润新知