• C# ref_out_params方法的参数_4种类型的参数


      之前学习C#没有做笔记的习惯,因此有些基础上的东西并没有很好地整理起来,虽然这些东西比较常用,因此也没什么影响,但总觉得不整理一下感觉老是有种陌生感。今天特别整理一下C#4种类型的参数。

    一、按值传递参数

      值参数是通过将实参的值复制到形参,来实现按值传递到方法,也就是我们通常说的按值传递。

      方法被调用时,CLR做如下操作:

      1、在托管堆栈中为形参分配空间;

      2、将实参的值复制到形参。

      这个太常用了,按值传递参数,是复制一份,因此不影响原来参数的值。

    复制代码
    public class Program
        {
            static void Main(string[] args)
            {
                int i = 1;
                int j = 2;
                int k = Plus(i,j);
                Console.WriteLine(i);   //输出 1
                Console.WriteLine(j);   //输出 2
                Console.WriteLine(k);   //输出 5
    
                Console.ReadKey();
            }
    
            public static int Plus(int i, int j)
            {
                i = i + 1;
                j = j + 1;
                return i + j;
            }
        }
    复制代码

    二、按引用传递参数 -- 关键字ref

      和前面的“按值传递”相对应的是按引用传递。顾名思义,这里传递的不在是值,而是引用。注意这里不是传递一个复制品了,而是将真实的自己传到方法中供方法玩弄。

      注意点:

      1、按引用传递的参数,系统不再为形参在托管栈中分配新的内存。

      2、此时,形参名其实已经成为实参名的一个别名,它们成对地指向相同的内存位置。

    复制代码
        public class Program
        {
            static void Main(string[] args)
            {
                int i = 1;
                int j = 2;
                int k = Plus(ref i,ref j);      //实参前也要加ref关键字
                Console.WriteLine(i);   //输出 2
                Console.WriteLine(j);   //输出 3
                Console.WriteLine(k);   //输出 5
    
                Console.ReadKey();
            }
    
            public static int Plus(ref int i, ref int j)    //形参钱要加ref关键字
            {
                i = i + 1;
                j = j + 1;
                return i + j;
            }
        }
    复制代码

      以上例子与上面的几乎一样,只是加了4个ref,留意到,在方法中对参数的修改,会对传方法的参数的值造成影响。

    三、输出参数 - 关键字out

      输出参数和引用参数有一定程度的类似,输出参数可用于将值从方法内传递到方法外,实际上就相当于有多个返回值。要使用输出参数只需要将引用参数的ref关键字替换为out关键字即可。但又一点必须注意,只有变量才有资格作为输出参数,文本值和表达式都不可以,这点要谨记。

      注意两个问题:

      1、编译器允许在方法中的任意位置、任意时刻读取引用参数的值。

      2、编译器禁止在为输出参数赋值前读取它。

      这意味着输出参数的初始值基本上是没意义的,因为它在使用前要被赋予新的值。因此想通过输出参数将值传入方法的路是行不通的。

    复制代码
        public class Program
        {
            static void Main(string[] args)
            {
                int i = 1;
                int j = 2;
                int k = Plus(i,out j);      //实参前也要加out关键字
                Console.WriteLine(i);   //输出 1
                Console.WriteLine(j);   //输出 100
                Console.WriteLine(k);   //输出 102
    
                Console.ReadKey();
            }
    
            public static int Plus(int i, out int j)
            {
                i = i + 1;
                j = 100;
                return i + j;
            }
        }
    复制代码

    四、参数数组 - 关键字params

      参数数组:

    复制代码
    public class Program
        {
            static void Main(string[] args)
            {
                int count1 = Plus(1);       //输出 1
                Console.WriteLine(count1);
    
                int count2 = Plus(1, 2, 3);//输出 6
                Console.WriteLine(count2);
    
                int count3 = Plus();    //输出 0  参数数组本身可选,没传入值也不会出错
                {
                    Console.WriteLine(count3);
                }
    
                Console.ReadKey();
            }
    
            public static int Plus(params int[] values)
            {
                int count = 0;
                foreach (int i in values)
                {
                    count = count + i;
                }
                return count;
            }
        }
    复制代码

      另外再补充两个C# 4.0的新特性可选参数与命名参数:

      1、可选参数

      可选参数,顾名思义,它不是必需的。对于一般的参数,如果不为它指定值,可能会导出运行出错。但是可选参数不会。

      可选参数的规则:

      1、可选参数不能为参数列表第一个参数,它必须位于所有必选参数之后;

      2、可选参数必须指定一个默认值;

      3、可选参数的默认值必须是一个常量表达式;

      4、所有可选参数以后的参数都必须是可选参数。

    复制代码
    public class Program
        {
            static void Main(string[] args)
            {
                int count1 = Plus(5);    //当不指定可选参数时,是默认值
                Console.WriteLine(count1);  //输出 15
    
                int count2 = Plus(5,5); //当指定可选参数时,有默认值
                Console.WriteLine(count2);  //输出 10
    
                Console.ReadKey();
            }
    
            public static int Plus(int i, int j = 10)
            {
                return i + j;
            }
        }
    复制代码

      2、命名参数

      可选参数解决的是参数默认值的问题,而命名参数解决的是参数顺序的问题,命名参数将我们从记忆每个方法数目繁多的参数列表中解放了出来。让你可以不按顺序输入参数。

    复制代码
    public class Program
        {
            static void Main(string[] args)
            {
                //string str = "字符串";
                //int i = 10;
                //Console.WriteLine(Plus(str:str,i:i));     //虽然很怪异,但这3行代码是能正常运行的
    
                Console.WriteLine(Plus(str:"字符串",i:10));      //注意顺序与方法签名参数中的不一样
    
                Console.ReadKey();
            }
    
            public static string Plus(int i, string str)
            {
                return str + i.ToString();
            }
        }
    复制代码
  • 相关阅读:
    直播报名| Kylin on Parquet 介绍及快速上手
    直播 | Apache Kylin & Apache Hudi Meetup
    1. MySQL体系结构和存储引擎——MySQL体系结构、存储引擎、连接MySQL
    深入理解Java虚拟机(第三版)-13.Java内存模型与线程
    Redis 字典实现
    JVM 判断对象已死亡?
    堆内存常见的分配策略、 经典的垃圾收集器、CMS与G1收集器及二者的比较
    String.intern() 和常量池
    Java 对象的创建过程(五步)、对象的内存布局、对象的访问定位
    Java内存区域(运行时数据区域)详解、JDK1.8与JDK1.7的区别
  • 原文地址:https://www.cnblogs.com/mingxuantongxue/p/3803692.html
Copyright © 2020-2023  润新知