对C#方法参数的理解

【前置知识】

对值类型和引用类型的理解

对C#中用new关键字实例化对象的理解

【值参数】

在调用方法时,将变量存储的数据复制给方法。具体而言,方法的参数(即形参)在内存中有自己的存储数据的空间,复制的数据被存储在其空间中。

【例子】

    class Program
    {
        static void Main(string[] args)
        {
            Program ps=new Program();
            int y = 10;//值类型
            string str = "asd";//引用类型
            Test test=new Test();//引用类型
            test.a = 10;
            ps.ValueParameter(y,str,test);
            Console.WriteLine(y+" "+str+" "+test.a);
            Console.ReadKey();
        }

        public void ValueParameter(int x,string str,Test test)
        {
            x += 10;
            str += "fgh";
            test.a += 10;
            Console.WriteLine(x+" "+str+" "+test.a);
        }
    }

    class Test
    {
        public int a;
    }

【输出】

【总结】

  • 对值类型:其存储的数据是值,调用方法时,参数获得该值,若对参数重新赋值,不会改变变量的值。
  • 对引用类型:其存储的数据是引用,调用方法时,参数获得引用,若对参数重新赋值,改变引用指向的数据,但不会改变量所存储的引用本身。
  • 参数名和变量名相同或不相同都没关系

【引用参数】

在调用方法时,将变量的引用传递给方法。可以认为直接将变量传给方法,而不是像值参数一样把副本传给方法。

【例子】

ps.ReferenceParameter(ref y,ref str,ref test);


        public void ReferenceParameter(ref int x,ref string str,ref Test test)
        {
            x += 10;
            str += "fgh";
            test.a += 10;
            Console.WriteLine(x + " " + str + " " + test.a);
        }

【输出】

【总结】

  • 对值类型:被调用的方法可以更改值类型变量的值(变量y的输出值从10变为了20)
  • 对引用类型:被调用的方法可以更改引用类型变量所指向的数据,同值参数类似,所以想更改引用类型变量所指向的数据时可以不用ref参数
  • 变量名和参数名相同或不相同都没关系
  • 使用ref参数前,对应的变量必须先赋值,因为在方法中可能先获取该变量的数据随后再重新赋值,而不是一开始就赋值。

【输出参数】

同ref类似,传递引用。使用ref时,方法会读取参数的值并重新赋值;使用out时,方法不会读取参数的值,只向参数赋值,参数会被认为是初始化的,即使参数有值。

【例子】

ps.OutParameter(out y, out str, out test);

     public void OutParameter(out int x, out string str, out Test test)
        {
            x = 20;//x = x+10会报错,因为x被认为是未初始化的,即未赋值
            str = "fgh";
            Test test2=new Test();
            test2.a = 20;
            test = test2;
            Console.WriteLine(x + " " + str + " " + test.a);
        }

【输出】

【总结】

  • 被调用的方法向参数中写入数据,而不读取数据
  • 参数会被认为是未被初始化的
  • 方法中所有返回路径都必须对参数赋值(某个返回路径未赋值,相当于参数未初始化)
  • 参数输出值可以认为是返回值,使得一个方法可以有多个返回值

【参数数组】

允许在调用方法时提供类型相同、数量可变的参数。

【例子】

            ps.ParameterArray(2,3,"sss","aaa");
            ps.ParameterArray(34,56,"aaa","987","kkk");

        public void ParameterArray(int x, int y, params string[] str)
        {
            string str2 = "";
            foreach (string s in str)
            {
                str2 += s;
            }
            Console.WriteLine(x + " " + y + " " + str2);
        }

【输出】

【总结】

  • 参数数组要放在所有形参后面(在写完前面的参数后,编译器才知道后面的参数属于参数数组,并自动将这些参数建立成一个数组传递给方法,而不用自己将这些参数建立成数组传给方法)(这里所说的参数就是实参)
  • 一个方法最多只有一个参数数组(如果有两个参数数组,那么编译器怎么分配这些参数呢,哪些参数属于参数数组A,哪些参数属于B)
  • 如果某个参数必须有,那么不要将其写为参数数组

【可选参数】

为参数提供默认值,在调用方法时可以不用给某些参数提供实参,即允许在调用方法时提供类型不同、数量可变的参数。

【例子】

            ps.OptionParameter(2);
            ps.OptionParameter(2,10);
            ps.OptionParameter(2, 10,"sss");


        public void OptionParameter(int x, int y = 5, string str = "enternalstar")
        {
            Console.WriteLine(x + " " + y + " " + str);
        }

【输出】

【总结】

  • 可选参数要在所有没有默认值的参数后面(写完前面的参数后,突然不给参数了,这时编译器知道了这个参数有默认值,可以不用我们再给值)
  • 默认值必须是在编译时能够确定的值,如常量

【命名参数】

之前调用方法时必须按照方法中参数的顺序给参数赋值,使用命名参数可以不按照这个顺序。

【例子】

            ps.NamedParameter(10,name:"sxd",y:10);

       public void NamedParameter(int x,int y=5,string str = "enternalstar",string name="aaa")
        {
            Console.WriteLine(x + " " + y + " " + str+" "+name);
        }

【输出】

【总结】

  • 使用命名参数时,调用方法时用的参数名(name)必须和方法中的参数名一致。

【总结】

方法有输入和输出,一般来说,输入的数量要多于输出。在各种不同的应用中,我们可能对输入和输出有不同的要求,例如有时我们希望输入的变量在调用方法后不会改变,有时希望能改变;有时我们可以确定要输入的参数数量,有时我们又不能确定要输入的参数数量;有时只要有一个输出就可以,有时要多个输出。

C#中提供的几种参数类型可以满足我们在各种不同应用中对输入和输出的要求。

如果我们希望变量的值在调用方法后不会改变,用值类型;

如果我们希望变量的值在调用方法后可以改变,一般用ref参数;

如果我们希望有多个返回值,可以用out参数;

如果我们有些参数会根据具体的情况来看用不用得到,那么可以用params参数;

如果有些参数在很多情况下用一个值就可以了,重复输入让我们感觉麻烦,那么用可选参数,给参数提供默认值;

如果方法有很多参数,有些参数有默认值,我们想跳过中间的参数,直接给那些靠后的参数赋值,那么用命名参数。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值