参数修饰符

2018-10-12  本文已影响0人  三岁能抬头

前言

刚开始没注意到参数还有挺多内容,后来看了一些文章发现还是有必要拿出来记录下形参实参,和值类型传递、引用类型传递。

形参和实参

类型 概念
形参parameter 定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数
实参argument 在调用时传递给函数的参数,可以是常量、变量、表达式、函数等

一个例子就能看明白:

public static void Main(string[] args)
{
  string myParams = "This is argument.";
  Console.WriteLine(myParams);
}
private void ShowParams(string str)
{
  Console.WriteLine("Parameter is + "str);
}

上面代码中myParams就是实参,ShowParams括号中的参数就是形参。

Params修饰符

先看例子:

public static void TestParams(params int[] list)
{
    for (int i = 0; i < list.Length; i++)
    {
        Console.Write(list[i] + "");
    }
    Console.WriteLine("\nint array in the end!");
}

public static void TestParams2(params object[] list)
{
    for (int i = 0; i < list.Length; i++)
    {
        Console.Write(list[i] + "");
    }
    Console.WriteLine("\nobject array in the end!");
}

我们定义两个方法TestParamsTestParams2参数分别为int[]object[]
接下来给方法传参,代码如下:

static void Main(string[] args)
{
    TestParams(1, 2, 3, 4);  //int数组
    TestParams2(1, "a", "test");  //object数组
    TestParams2();  //无参

    int[] myIntArray = { 5, 6, 7, 8, 9 };  //定义实参数组
    TestParams(myIntArray);  //传递实参
    TestParams2(myIntArray);  //传递int实参数组给object数组

    object[] myObjArray = { 2, 'b', "test", "again" };  //定义实参object数组
    TestParams2(myObjArray);  //传递实参object数组
}

结果如下:

1.  1234
2.  int array in the end!
3.  1atest
4.  object array in the end!
5.
6.  object array in the end!
7.  56789
8.  int array in the end!
9.  System.Int32[]
10. object array in the end!
11. 2btestagain
12. object array in the end!

值得注意的是第9行将int[]传入object[]入口输出的是System.Int32[]对象,在使用的时候注意输出的对象。

引用类型传值

首先我们要注意到的是一般我们定义的都是值类型的形参,实质是实参和形参之间的值赋值。
而引用类型的形参,可以理解为将指针传递过去,所以形参发生改变会影响到实参。

这里还不太清楚值类型和引用类型的可以看看之前写的随笔:
理解.NET内存回收机制

听不懂没关系,看例子:

class User
{
    public void Name(ref string tmps1, out string tmps2)
    {
        tmps1 = "传值后";
        tmps2 = "在这里面赋值了";
    }
}

定义一个名为Name的方法,形参分别定义为ref string tmps1out string tmps2,接下来对方法传值,代码如下:

static void Main(string[] args)
{
    string tmp1 = "传值前";
    string tmp2;
    User _user = new User();
    _user.Name(ref tmp1, out tmp2);
    Console.WriteLine("tmp1:{0}\ntmp2:{1}", tmp1, tmp2);
}

结果如下:

tmp1:传值后
tmp2:在这里面赋值了

结果很明显了,总结:

in放在最后讲是因为它修饰的参数是不予许被修改的,那不就是和不修饰一样吗?但其实要记住本质是引用地址的调用而不是值与值之间的赋值。

引文

END

上一篇下一篇

猜你喜欢

热点阅读