一、概念

C#中的命名参数和可选参数是两种函数参数的特殊形式,它们可以提高代码的可读性和灵活性。

命名参数

命名参数允许我们在调用函数时指定参数名称,从而不必按照函数定义时的参数顺序进行传参。这样做可以使代码更加易读易懂,同时也可以提高代码的灵活性,因为我们可以只传递某些参数来设置默认值。

以下是一个使用命名参数的示例:

void PrintPerson(string firstName, string lastName, int age) {
Console.WriteLine($"Name: {firstName} {lastName}, Age: {age}");
} // 使用命名参数调用PrintPerson函数
PrintPerson(lastName: "Smith", firstName: "John", age: 30);

在上面的示例中,我们使用了命名参数来调用PrintPerson函数,并且没有按照函数定义时的参数顺序进行传参。由于我们指定了每个参数的名称,因此代码更加易读易懂。

注意,当我们使用命名参数时,可以省略一些参数并采用默认值,但不能跳过非可选参数。例如,下面的代码是无法编译通过的:

PrintPerson(lastName: "Smith"); // 编译错误:缺少必需的参数 'firstName' 和 'age'

可选参数

可选参数允许我们在函数定义时为某些参数指定默认值,从而在调用函数时可以不传递这些参数。这样做可以提高代码的灵活性,因为我们可以只传递需要的参数,而不必传递所有参数。

以下是一个使用可选参数的示例:

void PrintPerson(string firstName, string lastName, int age = 18) {
Console.WriteLine($"Name: {firstName} {lastName}, Age: {age}");
} // 调用PrintPerson函数
PrintPerson("John", "Smith"); // 输出结果:Name: John Smith, Age: 18
PrintPerson("Mary", "Johnson", 25); // 输出结果:Name: Mary Johnson, Age: 25

在上面的示例中,我们定义了一个可选参数age,并将其默认值设置为18。当我们调用PrintPerson函数时,如果没有传递age参数,则会使用默认值。

注意,当我们使用可选参数时,必须将它们放在函数签名的末尾,并且不能使用ref或out关键字。例如,下面的代码是无法编译通过的:

void PrintPerson(string firstName, string lastName, ref int age = 18) { // 编译错误:可选参数不能使用ref或out关键字
Console.WriteLine($"Name: {firstName} {lastName}, Age: {age}");
}

总之,命名参数和可选参数都是C#中非常有用的语言特性,它们能够提高代码的可读性和灵活性,使程序变得更加易于维护和扩展。

二、实例

命名参数和可选参数的应用场景非常广泛,以下是一些经典的应用场景,并附有相应的代码示例:

命名参数

  1. 函数具有多个参数,但我们只关心其中的某几个参数。
void PrintPerson(string firstName, string lastName, int age) {
Console.WriteLine($"Name: {firstName} {lastName}, Age: {age}");
} // 使用命名参数调用PrintPerson函数,只传递了需要的参数
PrintPerson(lastName: "Smith", firstName: "John");
  1. 函数中具有相同类型的多个参数,使用命名参数可以提高代码的可读性。
void Search(int id, string name, string address) {
// ...
} // 使用命名参数调用函数Search,可以清楚地表明每个参数的含义
Search(id: 1, name: "John", address: "123 Main St.");

可选参数

  1. 函数中某些参数的默认值可能经常被使用。例如,在创建一个窗口时,我们可以将宽度和高度设置为可选参数,并将其默认值设置为800和600,因为这是大多数用户所期望的窗口大小。
void CreateWindow(int width = 800, int height = 600) {
// ...
} // 调用CreateWindow函数,不传递可选参数
CreateWindow(); // 窗口大小为800x600 // 调用CreateWindow函数,只传递一个可选参数
CreateWindow(width: 1024); // 窗口大小为1024x600 // 调用CreateWindow函数,传递两个可选参数
CreateWindow(width: 1024, height: 768); // 窗口大小为1024x768
  1. 函数中的某些参数是可选的,但如果提供了,则必须按照特定的格式进行传递。例如,在打印日志时,我们可以将时间戳设置为一个可选参数,并将其默认值设置为当前时间。
void Log(string message, DateTime timestamp = default(DateTime)) {
if (timestamp == default(DateTime)) {
timestamp = DateTime.Now;
}
Console.WriteLine($"[{timestamp}] {message}");
} // 调用Log函数,不传递可选参数
Log("Hello World!"); // 输出结果:[2021/10/01 12:00:00] Hello World! // 调用Log函数,传递时间戳作为可选参数
Log("Hello World!", new DateTime(2021, 9, 30, 23, 59, 59)); // 输出结果:[2021/09/30 23:59:59] Hello World!

总之,命名参数和可选参数是一种非常有用的C#语言特性,它们能够提高代码的可读性和灵活性。在实际开发中,我们应该根据具体场景选择合适的参数传递方式,以使代码更加清晰易懂。

《c#高级编程》第4章C#4.0中的更改(七)——命名参数和可选参数的更多相关文章

  1. javascript高级编程3第二章:在html中使用javascript

    2.1 <script>元素 向html页面中插入javascript的主要方法,就是使用<script>元素.这个元素被加入到正式的html规范中.html4.01为< ...

  2. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  3. ASP.NET MVC5 高级编程 第3章 视图

    参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...

  4. ASP.NET MVC5 高级编程 第2章 控制器

    参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...

  5. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  6. UNIX环境高级编程 第7章 进程环境

    本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...

  7. 【读书笔记】C#高级编程 第五章 泛型

    (一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...

  8. 《asp.net mvc3 高级编程》第二章 控制器

    一.控制器的角色 MVC模式中的控制器(Controller)主要负责响应用户的输入,并且在响应时通常会修改模型(Model).通过这种方式,MVC模式中的控制器主要关注的是应用程序流,输入数据的处理 ...

  9. 【读书笔记】C#高级编程 第六章 数组

    (一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同 ...

  10. 第四章 在MVC4.0中对脚本以及样式表的引用变化

    原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用“~”,而无需使用Href对象 ...

随机推荐

  1. Python根据时间命名并创建文件源码

    自己写的,产品中验证ok的代码,直接上实例: import time def file_create_func(): loca = time.strftime('%Y-%m-%d-%H-%M-%S') ...

  2. 基于python的json和cvs格式转换

    一 概念 1 json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Pr ...

  3. 浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素

    浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素 倾斜摄影是一种通过倾斜角度较大的相机拍摄建筑物.地形等场景,从而生成高精度的三维模型的技术.然而,在进行倾斜摄影操作时,由于多种因素的影响,导致 ...

  4. Cesium之原生控件

    1. 控件概述 Cesium的开始,基本上是从new一个Viewer开始 // ... <div id="cesiumContainer"></div> & ...

  5. hdfs的透明加密记录

    1.背景 我们知道,在hdfs中,我们的数据是以block块存储在我们的磁盘上的,那么默认情况下,它是以密文存储的,还是以明文存储的呢?如果是明文存储的,那么是否就不安全呢?那么在hdfs中是如何做才 ...

  6. 使用Go语言开发一个短链接服务:六、链接跳转

    章节  使用Go语言开发一个短链接服务:一.基本原理  使用Go语言开发一个短链接服务:二.架构设计  使用Go语言开发一个短链接服务:三.项目目录结构设计  使用Go语言开发一个短链接服务:四.生成 ...

  7. 【Nginx】如何使用自签CA配置HTTPS加密反向代理访问?看了这篇我会了!!

    写在前面 随着互联网的发展,很多公司和个人越来越重视网络的安全性,越来越多的公司采用HTTPS协议来代替了HTTP协议.为何说HTTPS协议比HTTP协议安全呢?小伙伴们自行百度吧!我就不说了.今天, ...

  8. 取cookie时报错“[object Object]“ is not valid JSON

    做谷粒学苑项目时,在保存登录状态环节出现该问题 取cookie时老师强调要使用JSON.pase()解析cookie为json对象 var userStr = cookie.get("gul ...

  9. modelsim常用操作

    modelsim常用操作 1.库的定义(library) modelsim是比较常用的仿真软件,主要用于数字电路的仿真,可以实现高效的前后仿真.仿真,就需要几个关键的元素:激励.设计模块.设计模块的约 ...

  10. KingbaseES V8R6集群运维案例之---securecmd连接需要密码问题

    KingbaseES V8R6集群运维案例之---securecmd连接需要密码问题 案例说明: 在KingbaseES V8R6集群可以使用securecmdd代替sshd实现集群主机节点间的通讯, ...