《c#高级编程》第4章C#4.0中的更改(七)——命名参数和可选参数
一、概念
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#中非常有用的语言特性,它们能够提高代码的可读性和灵活性,使程序变得更加易于维护和扩展。
二、实例
命名参数和可选参数的应用场景非常广泛,以下是一些经典的应用场景,并附有相应的代码示例:
命名参数
- 函数具有多个参数,但我们只关心其中的某几个参数。
void PrintPerson(string firstName, string lastName, int age) {
Console.WriteLine($"Name: {firstName} {lastName}, Age: {age}");
}
// 使用命名参数调用PrintPerson函数,只传递了需要的参数
PrintPerson(lastName: "Smith", firstName: "John");
- 函数中具有相同类型的多个参数,使用命名参数可以提高代码的可读性。
void Search(int id, string name, string address) {
// ...
}
// 使用命名参数调用函数Search,可以清楚地表明每个参数的含义
Search(id: 1, name: "John", address: "123 Main St.");
可选参数
- 函数中某些参数的默认值可能经常被使用。例如,在创建一个窗口时,我们可以将宽度和高度设置为可选参数,并将其默认值设置为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
- 函数中的某些参数是可选的,但如果提供了,则必须按照特定的格式进行传递。例如,在打印日志时,我们可以将时间戳设置为一个可选参数,并将其默认值设置为当前时间。
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中的更改(七)——命名参数和可选参数的更多相关文章
- javascript高级编程3第二章:在html中使用javascript
2.1 <script>元素 向html页面中插入javascript的主要方法,就是使用<script>元素.这个元素被加入到正式的html规范中.html4.01为< ...
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- ASP.NET MVC5 高级编程 第3章 视图
参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...
- ASP.NET MVC5 高级编程 第2章 控制器
参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- UNIX环境高级编程 第7章 进程环境
本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...
- 【读书笔记】C#高级编程 第五章 泛型
(一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...
- 《asp.net mvc3 高级编程》第二章 控制器
一.控制器的角色 MVC模式中的控制器(Controller)主要负责响应用户的输入,并且在响应时通常会修改模型(Model).通过这种方式,MVC模式中的控制器主要关注的是应用程序流,输入数据的处理 ...
- 【读书笔记】C#高级编程 第六章 数组
(一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同 ...
- 第四章 在MVC4.0中对脚本以及样式表的引用变化
原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用“~”,而无需使用Href对象 ...
随机推荐
- Spring 中不得不了解的姿势
说明 本文非原创,我只是进行了整理以及做了一些改动,仅供学习,若需进行商业使用,请联系原作者 原作者:苏三 原文链接:苏三说技术:Spring系列 Spring IOC 本章节解读的流程为Spring ...
- C++学习笔记之基础语法
目录 基础语法 switch和if区别 枚举定义及作用域 结构体数据耐齐--缺省对齐原则 函数重载overload与C++Name Mangling 指向函数的指针与返回指针的函数 基础语法 swit ...
- SQL语句之基础增删改查
目录 插入:NSERT INTO 语句 删除:DELETE 语句 更新:UPDATE 语句 选择 SELECT 语句 SELECT DISTINCT 语句 相关子句.运算符.关键字 WHERE 子句 ...
- linux环境下基于python的OpenCV 保存视频
一 概念 在OpenCV中保存视频使用的是VedioWriter对象,在其中指定输出文件的名称, A 创建视频写入的对象 out = cv2.VideoWriter(filename,fourcc, ...
- day03-自己实现Mybatis底层机制-02
自己实现Mybatis底层机制-02 7.任务阶段4&5 阶段4任务:开发Mapper接口和Mapper.xml 阶段5任务:开发和Mapper接口相映射的MapperBean (1)Mapp ...
- 04_QT_Windows开发环境搭建
FFmpeg 为什么选择FFmpeg? 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation.AudioUnit等 Android:Media ...
- 使用zxing来生成二维码
使用zxing来生成二维码 二维码已经成为了现代生活中不可或缺的一部分,无论是商业还是个人使用,二维码都有着广泛的应用.而在二维码的生成过程中,zxing是一款非常优秀的开源库,它提供了一系列的API ...
- PAT 甲级【1013 Battle Over Cities】
本题就是dfs.连通图个数-2: 但是java慢,最后一个case 超时 import java.io.*; import java.util.HashSet; import java.util.Se ...
- Adapter分组封装
YCGroupAdapter 01.前沿说明 1.1 案例展示效果 1.2 该库功能和优势 1.3 相关类介绍说明 02.如何使用 2.1 如何引入 2.2 最简单使用 2.3 使用建议 03.常用a ...
- js中订阅发布模式bus
export default { list: {}, // 事件中心集中地 /** * 发布订阅 * @param {string} name 事件名 * @param [...args] */ $e ...