一、 命名参数、可选参数

命名参数和可选参数是在Visual C#2010中引入的新特性。 笨地儿我个瓜不兮兮的,今天才知道

  • 可选参数:定义方法时为参数设置默认值,调用该方法时可以省略为某些形参指定实参。
  • 命名参数:调用方法时,通过指定参数名称的方式为特定形参指定实参。指定时是根据名称将形参和实参关联,而不是与参数在列表中的位置关联。

例如:

class Program
    {
        static void Main(string[] args)
        {
            //可选参数
            Employee.DisplayInfo(24, "程序员");         //相当于 Employee.DisplayInfo(24, "程序员", 0, "未知",default(datetime)); 
            Employee.DisplayInfo(25, "英语相关", 9500); //相当于 Employee.DisplayInfo(25, "英语相关", 9500,"未知",default(datetime));
            //命名参数
            //相当于Employee.DisplayInfo(30, "高级软件工程师", 20000, "Yathur",DateTime.Now);
            Employee.DisplayInfo(30, Job: "高级软件工程师", Salary: 20000, Name: "Yathur", dt: DateTime.Now);
            Employee.DisplayInfo(Age: 25, Job: "教师");
            Console.Read();
        }
    }
    public class Employee
    {
        public static void DisplayInfo(int Age, string Job, int Salary = default(int), string Name = "未知", DateTime dt = default(DateTime))
        {
            Console.WriteLine("姓名:" + Name + ",   年龄:" + Age + ",   职位:" + Job + ",   月薪" + Salary + "   " + dt);
        }
    }运行结果:

在智能感知中,可选参数为方括号标识。

有了命名参数,调用时可以方便地按照形参名称进行,我们不需要记住或查找形参在所调用方法的形参列表中的顺序。 有了可选参数,当面对包含大量参数的方法时,如果含有默认值,我们可以只给有意义的参数指定实参,用起来方便了很多。

使用规则:
  • 未设置默认值的参数也可以按名称传递。

Employee.DisplayInfo( Age:25,Job:"教师");

  • 命名参数可以调换顺序,但是得保证有默认值的参数必须放在无默认值的参数之后,否则会产生编译错误。

注意:如果参数中存在数组参数,这个规则不成立。因为数组参数没有默认值,也要放到参数列表的最后。

  • 默认值必须是编译时就能确定的值。例如基元类型、枚举类型、能设为Null的引用类型等。经常将默认值设置为相应的零值,可以使用关键字default、new来实现。
  • 含有ref或Out关键字的参数不能设置默认值,会产生编译错误。因为这些参数不好设置有意义的默认值

二、 引用方式传参—Out, Ref

CLR假定方法的参数是以传值方式进行的,但它允许以传引用的方式传递参数。C#通过Out和ref关键字可以传递指向实例的一个指针,而不是参数本身的值。

Out和Ref的使用区别:

  • Out: 在调用之前不必初始化参数值;   被调用的方法内部不能读取参数值;        返回之前必须为该参数赋值。
  • Ref:  调用之前必须初始化参数值;      被调用方法可以读取或者写入参数的值;  返回之前可以不为该参数赋值(不考虑程序实际意义)。
1. 值类型使用Out和Ref

运行结果:

相应的IL元数据:

2. 引用类型使用out和ref

当调用方法时,如果形参类型为实参类型的基类,一般会发生隐式转换。例如:

public static void Swap(object a, object b)
       {
           object t = a;
           a = b;
           b = t;
       }

string a = "AAA", b = "BBB";
          Swap(a, b);
          Console.WriteLine("a=" + a + " b=" + b);

但是运行结果并非我们所愿,因为方法默认是以传值方式传递参数的,调用后原来的值是不会改变的。

当以传引用的方式向方法传递参数时,必须保证变量类型与方法签名中类型一致,而不能自动进行隐式转换,否则会产生编译错误。例如:

public static void Swap(ref object a, ref object b)
      {
          object t = a;
          a = b;
          b = t;
      }

为了实现想要的效果,我们可以采用泛型

public static void Swap<T>(ref T a, ref T b)
       {
           T t = a;
           a = b;
           b = t;
       }

static void Main(string[] args)

{

string a = "AAA", b = "BBB";

Swap(ref a, ref b);

Console.WriteLine("a=" + a + " b=" + b);

Console.Read();

}

3. 重载

在C#中,可以使用Out或者ref关键字进行方法重载,例如下面的例子是合法的:

但是如果两个方法名称和参数相同,仅通过out和ref关键字是不能算作重载的。

三、 可变数量参数传递—Params

某些时候,我们希望方法参数的个数是可变的,Params帮我们实现了这个想法。

实例

假如不使用Params关键字,我们需要使用第①种调用方式。当添加Params关键字后,我们可以采用②③,调用方式看上去更加直观了。实现了传递可变数量参数的效果。

注意事项:
  • Params关键字参数只能放在参数列表的最后,如果调换上面例子中两个参数位置,会产生编译错误。

  • Params关键字只能标识任意类型的一个一维数组。
  • Params参数允许为Null值或者长度为0的数组。例如上面例子中的④⑤。
  • Params方式其实会造成一些性能损失,例如在堆上为数组分配内存、数组初始化等,所以尽量不要过多使用变长参数。

CLR via C#(10)-参数的更多相关文章

  1. SWIG 3 中文手册——10. 参数处理

    目录 10 参数处理 10.1 typemaps.i 库 10.1.1 引言 10.1.2 输入参数 10.1.3 输出参数 10.1.4 输入 / 输出参数 10.1.5 使用不同的名称 10.2 ...

  2. 【CLR in c#】参数

    1.可选参数和命名参数 设计一个参数时,可为部分或全部参数分配默认值,调用这些方法的代码可以选择不指定部分实参,接受默认值,还可以通过制定参数名称的方式传递实参.如下 class CLR可选参数 { ...

  3. [CLR via C#]10. 属性

    一.无参属性 对于字段,强烈建议将所有的字段都设为private.如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法.封装了字段访问的方法通常称为访问器(accessor)方法.访问器方 ...

  4. [CLR via C#]9. 参数

    一.可选参数和命名参数 在设计一个方法的参数时,可为部分或全部参数分配默认值.然后,调用这些方法的代码时可以选择不指定部分实参,接受默认值.此外,调用方法时,还可以通过指定参数名称的方式为其传递实参. ...

  5. <NET CLR via c# 第4版>笔记 第9章 参数

    9.1 可选参数和命名参数 class Program { private static int s_n = 0; private static void M(int x = 9, string s ...

  6. CLR via C#深解笔记四 - 方法、参数、属性

    实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, ...

  7. nginx 伪静态大于10个参数 $10

    伪静态大于10个参数   会解析成 $1   与 0 参考:http://zhidao.baidu.com/link?url=kT2tp8ARhIZsrt4XF3LdzjkEq0QTIbvhOj9Ck ...

  8. CLR via c#读书笔记六:参数

    注:书本第9单参数 CLR默认所有方法参数都传值.引用本身是值引的,意味左方法能修改对象,而调用都能看到这些修改.值类型,传的是实例的一个副本,所以调用者不受影响. (和以前理解的不一样.默认都是传值 ...

  9. 重温CLR(六)方法和参数

    实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法.构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称).创建引用类型的实例时,首先为实例的数据 ...

随机推荐

  1. BZOJ1500——维修序列

    动态的最大子段和 就是splay啊,说一下GSS1吧,维护四个值,一个是这个区间和(下面说sum), 一个是从左边开始的最大和(下面说ls)和右边开始的最大和(下面说rs), 还有一个就是最大区间和( ...

  2. eclipse svn

    1.上传初始项目在百度云上面创建一个空版本,然后右击项目->team->shareProject在svn的url后面加上你的版本号(否则上传失败) 2.把服务器上的项目更新到自己的项目wi ...

  3. WEB前端知识在乱花渐欲迷人眼的当下,如何分清主次和学习优先级呢?

    从正美的吐槽开始,我回了下,说对盲目跟风的大众失去信心了.然后一些同学说我固步自封,另一些同学估计想说倚老卖老啥的.我想说清楚一点,我从 未停止过学习,只是对知识的重要程度和精力分配有自己的观点.具体 ...

  4. Fibonacci 1

    Fibonacci 1 题面 \[F_0=0,F_1=1,F_n=F_{n-1}+F_{n-2}\] 给定\(n\),求 \[S(n)=\sum_{i=1}^{n}F_nF_{n-1}\] 数据格式 ...

  5. STL---vector(向量)

    1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a) ...

  6. C#之Windows消息处理

    public enum WindowsMessage:int { /// <summary> /// /// </summary> WM_NULL = 0x0000, /// ...

  7. Linux之图形化shell------dialog

    转自:Linux dialog详解(图形化shell) | 运维生存时间 对话 UNIX: 使用 shell 脚本创建好的图形应用程序---http://www.ibm.com/developerwo ...

  8. struts2 插件使用

    1.引用这个jar包 2.http://localhost:8080/strute2demo/config-browser/actionNames.action

  9. 基础知识(javaWeb工程目录结构)及各文件夹的作用

    在Eclipse中只要创建一个Dynamic Web Project,就可以根据创建向导创建出一个典型Java Web站点的目录结构.除非有特殊需要,在大多数情况下都没有必要修改这个目录结构,这也是W ...

  10. ubuntu14.04和win7共享文件夹

    环境:vmware12 问题:安装了vmware-tools,但是在/mnt/hgfs下面看不到共享的文件夹. 按照网上的一些经验和教程使用如下命令: mount -t vmhgfs .host:/ ...