最近几天学了参数,其实对于参数本不陌生,从上学学C语言基础的时候就学过了。不过细心学下来,还是收获了一些。


一、 命名参数、可选参数

命名参数和可选参数是在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方式其实会造成一些性能损失,例如在堆上为数组分配内存、数组初始化等,所以尽量不要过多使用变长参数。

转载于:https://www.cnblogs.com/janes/archive/2011/08/09/2131163.html

跟小静读CLR via C#(10)-参数相关推荐

  1. 跟小静读CLR via C#-开篇及目录

    最近正在拜读Jeffrey大师的.NET巨作-<CLR via C#>.好书就像一杯茶,需要静下心来慢慢品.在写笔记的过程中,也加入了自己的思考:在和园友们的交流中,理解也不断的加深. 目 ...

  2. 跟小静读CLR via C#(02)-基元类型、引用类型、值类型

    跟小静读CLR via C#(02)-基元类型.引用类型.值类型 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架类库FCL存在着直接的映 ...

  3. 跟小静读CLR via C#(05)- 访问限定、数据成员

    跟小静读CLR via C#(05)- 访问限定.数据成员 今天跟大家分享一下关于访问限定和数据成员的知识.主要包括以下两点: Abstract, sealed, virtual, new, over ...

  4. 跟小静读CLR via C#(06)- 构造器

    跟小静读CLR via C#(06)- 构造器 最近忙着看新还珠,好几天不学习了.玩物丧志啊,罪过罪过. 今天总结的是类构造器的知识,其实这方面的文章蛮多的,可还是觉得亲自写一下对自己的思考和认识会有 ...

  5. 跟小静读CLR via C#(16)--泛型

    泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性. 一.初识泛型 1. 简单实例 以最常用的FCL中的泛型List<T >为例: stat ...

  6. 跟小静读CLR via C#(18)——Enum

    1. Enum定义 枚举类型是经常用的一种"名称/值"的形式,例如: public enum FeedbackStatus      {          New,         ...

  7. 跟小静学CLR via C#(12)-委托Delegate

    本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...

  8. 跟小静读《jQuery权威指南》——目录

    前言 2014年开始了,年底给自己制订的学习计划,第一步先从学习<jQuery权威指南>开始. jQuery大家都很比较熟悉,但是我经常是边用的时候边对照着API,这次找本书通读一遍,记录 ...

  9. 导师神总结:读博失败的10个作死大法

    ↑ 点击蓝字 关注视学算法 来源丨管理学季刊 编辑丨极市平台 极市导读 为帮助博士生们顺利毕业,哈佛医学院的Matt Might教授总结出了读博失败的十大原因,包括学习过泛.目标过高.完美主义.行动拖 ...

最新文章

  1. 关于AES算法及JAVA中的实现
  2. 给Qt程序加上版本信息
  3. python收取wss数据_Python金融应用之提取交易日+合并截面数据
  4. IDEA集成Scala图文教程详细步骤
  5. 【Elasticsearch】请在64位平台上使用Lucene的MMapDirectory
  6. java自定义栈类代码,异常堆栈和自定义类
  7. cacti安装的一个错误
  8. 【贪心】 【HDU 5821】 Ball
  9. python机器学习应用mooc_(1)KNN
  10. android代码改字体颜色,如何更改Android Studio的代码字体和颜色
  11. Jmeter测试计划无法保存或者另存为
  12. 5位数的数字黑洞是多少_揭秘数字黑洞6174
  13. Linux下的磁盘分区简介
  14. Asio Buffers
  15. 使用eclipse编写第一个Java程序及运行(超详细)
  16. 交友项目【查询黑名单人员,移除黑名单人员】功能实现
  17. cesium实现动态圆效果之——螺旋圆
  18. 【转】流媒体技术笔记(视频编码相关)
  19. 图书信息管理系统c语言txt,小型图书信息管理系统(C语言)
  20. MySQL(入门篇18)SQLyog 的用户权限管理 ; SQL语句的用户权限管理。

热门文章

  1. java smtp收信_求一个简单java编写的邮件收发程序,邮件发送程序为smtpsend,邮件接收程序为popreceive。急需,感谢。...
  2. 【实例解析】大型服装集团BI决策系统的分析主题模块
  3. vue修改代码同步页面_vue实现两个组件之间数据共享和修改操作
  4. 小程序 getphonenumber_小程序入门,看这一篇就够了!
  5. html页面之间传表格,如何在html 页面插入一个表格,参数的传递,
  6. java switch小程序,微信小程序 switch组件详解及简单实例
  7. glibc版本查看_[译] 写一个简单的内存分配器(替换glibc中的malloc函数)
  8. java 线程 condition_Java编程中实现Condition控制线程通信
  9. string的insert
  10. 超参数搜索——初始学习率搜索的学习笔记