• C#中参数前缀ref、out的使用


    一、使用ref、out前缀与不使用前缀的区别

         int intParam = 0;           

         object objParam = null;   

         public void method(int intParam,object objParam)     //intParam是值类型形参, objParam是引用类型形参

        {

                 //do  something.....

         }

        public void Main()

        {

              method(intParam,objParam) ; //intParam是值类型实参, objParam是引用类型实参

        }

        

         不使用前缀时,向方法传递一个实参时,对应的形参会使用实参的一个副本来初始化。对于值类型的实参副本等于该值本身,而对于引用类型的实参副本则等于引用变量的值。 如果为一个形参附加了ref关键字,该参数就会成为实参的一个别名,而不再是实参的一个副本。

    二、ref、out的区别

         使用ref的参数必须先赋值,out的可以不初始化参数。其余的作用相同。

    三、ref应用于引用类型的参数

         对于引用类型的参数,加ref前缀,传递的是原引用变量的引用,如果你在方法体内对形参重新赋值,那么将影响到实参,即形参和实参的引用是同一地址;不加ref前缀,传递的是原引用变量的副本,即使你在方法体内对形参重新赋值,不影响实参,即形参和实参的引用是不同的。

        示例:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Parameters
    {
        class WrappedInt
        {
            public int number;
    
        }
        class Pass
        {
            public static void Value(ref int param)
            {
                param = 10;
            }
            //使用引用类型的参数,方法体内不对参数的引用做任何修改
            public static void Reference(WrappedInt param)
            {
                param.number = 50;
            }
            //使用加了ref修饰符的引用类型的参数,方法体内对参数的引用做了修改
            //由于使用了ref修饰符,所以将影响到实参。
            public static void refReference(ref WrappedInt param)
            {
                WrappedInt wi = new WrappedInt();
                wi.number = 100;
                param = wi;
            }
            //使用未加ref修饰符的引用类型的参数,方法体内对参数的引用做了修改
            public static void NorefReference(WrappedInt param)
            {
                WrappedInt wi = new WrappedInt();
                wi.number = 100;
                param = wi;
            }
        }
        class Program
        {
            static void DoWork()
            {
                WrappedInt reParam = new WrappedInt();
    
                Console.WriteLine(reParam.number);
                Pass.Reference(reParam);       //使用引用类型变量,实参和方法体内的形参引用的是同一个地址。
                Console.WriteLine(reParam.number);
                 Pass.NorefReference(reParam); //未使用ref修饰符,虽然在方法体内修改了形参的引用,但不影响实参reParam
                Console.WriteLine(reParam.number);
                Pass.refReference(ref reParam); //由于使用了ref修饰符,在方法体内修改了形参的引用将影响到实参reParam。
                Console.WriteLine(reParam.number);
            }
    
            static void Main(string[] args)
            {
                try
                {
                    DoWork();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
    复制代码
  • 相关阅读:
    最大的错误就是没有把自己的软件开发事业当 作一桩生意来看待
    python:open/文件操作
    Python 之ConfigParser
    Python 之ConfigParser
    Python 之ConfigParser
    python的time模块使用
    python的time模块使用
    python的time模块使用
    国外、国内各大OJ
    国外、国内各大OJ
  • 原文地址:https://www.cnblogs.com/moss_tan_jun/p/2611681.html
Copyright © 2020-2023  润新知