C#第4讲:轻松应对C#的几种参数类型

c#语言中有几种参数类型,这边做个简单的总结,供大家参考和学习。

1、具名参数

具名参数顾名思义就是出具参数的名字,在调用有参数的方法时,我们需要根据参数的顺序和类型给参数赋值,否则程序就会报错的。而具名参数就可以打破这种约束,使用起来也是非常的简单:

        public int Reduce(int fir , int sec){
            return fir - sec;
        }

        public void Demo()
        {
            //普通调用
            Reduce(15, 12);  
            //具名调用
            Reduce(sec:12,fir:15); // 13
        }

具名参数有这么几点好处:首先他可以在一定程度上增加程序的可读性,前提是参数的名称不要乱写,一定要有意义;还有一点就是可以不受参数位置的约束。

2、可选参数

可选参数在实际的开发中很有用武之地的,也是非常的简单易用,说白了就是给参数设置默认值。同样,我们通过一个简单的例子来看一下:

    public string UserInfor(string name = "mac", string age = "27", string tel = "18888888888")
    {
        return "我的名字是" + name + ",我今年" + age + "岁,我联系方式:" + tel;
    }

    public void Demo()
    {
        string ss = UserInfor();                    //我的名字是mac,我今年27岁,我联系方式:18888888888
        string ss1 = UserInfor(name: "maaici");     //我的名字是maaici,我今年27岁,我联系方式:18888888888
        string ss2 = UserInfor(age: "18");          //我的名字是mac,我今年18岁,我联系方式:18888888888
        string ss3 = UserInfor(tel: "18852999999"); //我的名字是mac,我今年27岁,我联系方式:18852999999
    }

 我在平时的开发中常会有这样一个场景:想修改或者拓展一个现有的方法,但是有很多地方调用,有了可选参数我们就可以对方法进行拓展,而不用改变原先的调用代码,也不用重新写一个类似的方法,产生冗余代码。

另外,可选参数必须在所有必需参数的后面!

3、this 参数

 this 参数最主要的用途就是为目标类型拓展方法。关于拓展方法我的另外一个文章中有过详细的介绍,附带简单的例子供参考用。请戳:拓展方法的定义及调用和微软拼音组件的使用

4、值参数和引用参数

这两个类型的参数放在一起来介绍。首先我们要把值参数、引用参数和C#的值类型和引用类型区分开来,这并不是同一个东西,对于值类型个引用类型,我推荐一篇文章,感兴趣的同学可以去学习一下:https://www.cnblogs.com/bakuhert/articles/5878086.html

引用参数和值参数的区别在于是否有ref关键字来修饰,不加ref的参数统称为值参数。值参数就是常说的传值参数,当我们把一个变量的值作为方法的参数传递给方法,其实是在方法中创建了一个副本,在方法中对这个副本的各种修改都不会影响方法外面的那个本尊(有例外,下面会强调)。但是我们有时候就是需要在方法里面的修改,同步到本尊,就需要引用变量出马了。下面用代码来简答的说明一下

static void Main(string[] args)
{
    int number = 1314;
    Console.WriteLine("我现在是:" + number);
    Add100(number);
    Console.WriteLine("我现在是:" + number);
    Add1000(ref number);//这边也必须要加上 ref 关键字
    Console.WriteLine("我现在是:" + number);
    Console.ReadLine();
}

public static void Add100(int num)//传值参数
{
    num += 100;
}

public static void Add1000(ref int num)//引用参数
{
    num += 1000;
}

 结果:

 刚刚上面说了传值参数会有例外的情况,那么就是在给值参数传递引用参数的时候,请看代码:

class Program
{
    static void Main(string[] args)
    {
        Person maaici = new Person { NAME = "maaici", AGE = 26 };
        Console.WriteLine("我的名字是:" + maaici.NAME + ",今年" + maaici.AGE + "岁。");
        ChangeYourName(maaici);
        Console.WriteLine("我的名字是:" + maaici.NAME + ",今年" + maaici.AGE + "岁。");
        Console.ReadLine();
    }

    public static void ChangeYourName(Person person) {
        person.NAME = "曾阿牛";
    }
}
public class Person {
    public string NAME { get; set; }
    public int AGE { get; set; }
}

大家猜一下,我到底是谁?

6、输出参数

输出参数是用out关键字修饰的参数。我们都知道一个方法至多就只能有一个返回值,有时候我们会需要有多个返回值,这时我们就可以使用输出参数。我个人的觉得输出参数和引用参数很像,都可以改变传进方法的变量本身,有时候我们甚至可以换着用。但是有一个区别,引用参数必须是赋值过的参数,否则会报错,但是输出参数却可以使用没有赋值的变量,并且输出参数原来的值将变得没有意义,因为在有输出参数的方法中,必须要对变量进行赋值。

7、参数数组

参数数组有的也叫可变参数,用params 关键字来修饰。主要用途是我们不知道参数的类型有多少个的情况下,避免重复多次的重载下使用的,有一个经典的例子,一起看一下:

private static void Main(string[] args)
{
    //可以一个一个输
    Console.WriteLine("最大的数字是:" + GetMaxNumber(2,3,34,54,232,32,232,32,45,65665,757));
    //也可以直接传一个数组
    int[] numbers = new int[] { 2, 3, 34, 54, 232, 32, 232, 32, 45, 65665, 757 };
    Console.WriteLine("最大的数字是:" + GetMaxNumber(numbers));
    Console.ReadKey();
}

public static int GetMaxNumber(params int[] nums) {
    int maxNum = -99999;
    if (nums.Length > 0) {
        foreach (int item in nums) {
            if (maxNum < item)
                maxNum = item;
        }
    }
    return maxNum;
}

在使用可变参数的有以下几个注意点:

1、若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。

2、不允许将params修饰符与ref和out修饰符组合起来使用。

3、参数数组必须是一维数组。

4、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。

5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。

6、有参数数组的方法的优先级要小于没有参数数组的重载。例如:

private static void Main(string[] args)
{
    //以下调用两个重载都没问题,但是他优先调用没有参数数组的重载。
    string retMsg = DoSomeThing("我没用", "我没用");
    Console.WriteLine(retMsg);  //结果是 : 我没有参数数组
    Console.ReadKey();
}

public static string DoSomeThing(string str1,string str2) {
    return "我没有参数数组。";
}
public static string DoSomeThing(params string[] strs)
{
    return "我有参数数组。";
}

以上是对C#参数的整理,如果有错误,请帮忙指出。

下一讲:C#第五讲:类和成员的访问修饰符

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值