方法的参数有六种,分别是值参数、引用参数、输出参数、参数数组、命名参数、可选参数。

值参数

值参数是方法的默认类型,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作;

  1. 在栈中为形参分配空间。
  2. 复制实参到形参。

1)在方法被调用前,用作实参的变量a1的引用已经在栈里了。

2)随着方法的开始,系统在栈中为形参分配空间,并从实参复制值。

3)因为a1是引用类型,所以引用被复制,结果实参和形参都引用堆中的同一个对象。

4)因为a2是值类型,所以值被复制,产生了一个独立的数据。

5)在方法执行后,形参被从栈中弹出。

6)a2、值类型,它的值不受方法行为的影响。

7)a1、引用类型,它的值被方法的行为改变了。

引用参数

  1. 使用引用参数时,必须在方法的声明与调用中使用ref修饰符。
  2. 实参必须是变量,在用作实参前必须赋值。

  

对于值参数,系统在栈上为形参分配内存;相反,对于引用参数,形参的参数名看起来就好像是实参变量的别名,也就是说,它们指向的是相同的内存位置。所以在方法的执行过程中对形参作的任何改变,在方法执行完成后依然有效(表现在实参变量上)。

引用参数的传递,对值类型与引用类型都是完全传递,不存在复制值与复制引用,即引用相同的内存位置。

输出参数

输出参数用于从方法体内把数据传递到调用代码,它非常类似引用参数。

1,必须在方法的声明与调用中使用out修饰符。

2,和引用参数相似,实参必须是变量。

就像引用参数,输出参数的形参担当实参的别名,方法内对形参的任何改变在方法执行完成后,通过实参变量都可见。

与引用参数的不同,输出参数有以下2个要求。

  1. 在方法内部,输出参数在被读取之前必须被赋值,这意味着参数的初始值是无关的,因此没有必要在方法调用之前为实参赋值。
  2. 在方法返回前,方法内部的任何贯穿的可能路径都必须为所有输出参数进行一次赋值。

参数数组

上面3中参数方式,必须严格的一个实参对应一个形参,参数数组不一样,它允许零个或多个实参对应一个特殊的形参。

参数数组的要求如下:

  1. 在一个参数列表中只能有一个参数数组。
  2. 如果有,它必须是列表中的最后一个。

声明参数数组,必须要有params修饰符(调用不需要修饰符),必须是一种类型的数组。

使用分散式传参时,编译器做如下事:

1)接受实参列表,用它们在堆中创建并初始化一个数组。

2)把数组的引用保存到栈中的形参里。

3)如果在对应的形参数组的位置没有实参,编译器会创建一个有零个元素的数组来使用。

4)如果数组参数是值类型,那么值被复制,实参不受方法内部的影响。

5)如果数组参数是引用类型,那么引用被复制,实参引用的对象可以受到方法内部的影响。

在使用数组式传参时,编译器使用你的数据而不是重新创建一个。即相当引用参数。

命名参数

上面用到的四种参数,都是位置参数,也就是说每个实参的位置必须一一对应相应的形参位置。

从.Net4.0开始,只要显示指定参数的名字,就可以以任意顺序在方法调用中列出实参,细节如下。

1.方法的声明没有什么不一样。形参已经有名字了。

2.不过在调用方法的时候,形参的名字后面跟着冒号和实际的参数值或表达式。

在调用的时候,也可以位置参数和命名参数混合使用,但是所有的位置参数必须先列出,

可选参数

可选参数是.Net4.0才加入的,在调用方法的时候可以包含这个参数,也可以省略它。

为了表明某个参数是可选的,你需要在方法声明的时候为参数提供默认值。制定默认值的语法和初始化本地变量的语法一样。

如下图

1)形参b设置成了默认值。

2)因此,在调用方法的时候只有一个参数,方法会使用3作为第二个参数的初始化。

对于可选参数的声明,有几个重要事项:

1.不是所有的参数类型都可以作为可选参数。

  1)只要值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数。

  2)只有在默认值是null的时候,引用类型才可以作为可选参数来使用。

  3)可选参数只能是值参数。

2.所有必填参数必须在可选参数声明之前声明,如果有params参数,必须在所有可选参数之后声明。

3.必须从可选参数列表的最后开始省略,一直到开头,否则会造成参数歧义。

4.若想消除参数歧义,可以结合命名参数和可选参数的特性。

如下图

转载于:https://www.cnblogs.com/zl181015/p/9237509.html

C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数...相关推荐

  1. c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)

    一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会对调用 ...

  2. c# 方法参数 传值or传引用?(ref,out,可变参数params,可选参数,命名参数)

    目录 一.方法参数的类型----值类型和引用类型 二.一些特殊的方法参数 1.引用参数---ref 2.输出参数---out 注意:ref和out的区别 3.可变参数/参数数组-----params ...

  3. java方法可选参数_Java可选参数

    java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...

  4. [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性

    前言 下面就开始总结C#4.0的一些变化了, 也是这本书中最后的一点内容了, 这一部分终于要更新完了. 同时感觉再来读第二遍也有不一样的收获. 今天很嗨的是武汉下雪了,明天周六,一切都是这么美好.哈哈 ...

  5. 《CLR Via C# 第3版》笔记之(十) - 可选参数和可变数量参数

    C#中也可以像动态语言那样,定义可选参数和可变数量参数.通过使用可选参数和可变数量参数可以构建更加灵活的函数. 主要内容: 可选参数 可变数量参数 1. 可选参数 可选参数即调用函数时,传递参数的个数 ...

  6. C#4.0 命名参数可选参数

    c#4.0中新特性之一就是:命名参数和可选参数. 命名参数:调用方法时,可以不按位置传递参数,而是指定参数的命名来传值: private void Func(string str,int number ...

  7. C#中命名参数和可选参数

    调用方法时,变量名不需要添加到调用中.比如有如下的方法用于移动矩形并在移动之后设置他的宽和高: public void MoveAndResize(int x,int y,int width,int ...

  8. python中可选参数如何指定_Python可选参数

    Python 2 documentation, 7.6. Function definitions提供了几种方法来检测调用者是否提供了可选参数. 首先,可以使用特殊的形参参数语法*.如果函数定义具有以 ...

  9. go如何实现可选参数

    大家好,我是peachesTao,今天我们来聊一聊go的函数可选参数话题 go语言设计的时候函数就不支持默认参数,以下为go语言之父Rob Pike关于这个设计的一段话: One feature mi ...

最新文章

  1. java学习--抽象类与接口
  2. linux ssh -R 代理不同内网主机互连
  3. pytorch 归一化 测试(BatchNorm2d)
  4. 用 git 保存空目录
  5. 0x13链表与邻接表之邻值查找
  6. 观物外篇-唐-邵雍:(一)
  7. C/C++中函数参数传递
  8. rocketMq双master集群模式下故障演练
  9. java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能
  10. 不肯去幼儿园的小盆友
  11. rrpp协议如何修改_RRPP协议做为高级网络工程师不能不懂的技术带你快速学习
  12. linux 键盘 键值0x1e,Linux文本处理三剑客之awk学习笔记11:选项、内置变量和内置函数...
  13. 人与人之间需要最基本的信任
  14. 正式“退休”的Flash,未来我们会怀念它吗?
  15. 资源管理器 右键 反应慢 现象解决方案
  16. 服务器间互传文件,服务器互传文件
  17. python爬取搜狗微信指定关键词的全部内容
  18. 两分钟解决IntelliJ IDEA中文乱码问题
  19. java单例模式构造器初始化_秒懂java单例模式,java私有构造器与一夫一妻制
  20. 实践:动手搭建聊天机器人

热门文章

  1. swift python 性能_Swift 性能探索和优化分析
  2. 线性回归和逻辑回归的区别_Spark实现线性回归与逻辑回归算法
  3. python抓取图片_Python3简单爬虫抓取网页图片
  4. 电容的q值计算公式_(生活小贴士)一分钟了解“三星贴片电容的结构与材料特性”...
  5. 7.王道考研数据结构-队列
  6. void类型指针 指针的各种组合
  7. python中random库
  8. 安卓数据读写全解:SharedPreferences公共数据的读写,SQLiteDatabase数据库,mysql数据库
  9. java实现代理服务器,接收客户端连接,发送到对应服务器
  10. Docker Yearning + Inception SQL审核平台搭建