windows C#-命名实参和可选实参(上)

news/2024/12/24 1:47:25/

通过命名实参,你可以为形参指定实参,方法是将实参与该形参的名称匹配,而不是与形参在形参列表中的位置匹配。 通过可选参数,你可以为某些形参省略实参。 这两种技术都可与方法、索引器、构造函数和委托一起使用。

使用命名参数和可选参数时,将按实参出现在实参列表(而不是形参列表)中的顺序计算这些实参。

通过命名形参和可选形参,你可以为所选形参提供实参。 此功能极大地方便了对 COM 接口(例如 Microsoft Office 自动化 API)的调用。

命名参数

有了命名实参,你将不再需要将实参的顺序与所调用方法的形参列表中的形参顺序相匹配。 每个形参的实参都可按形参名称进行指定。 例如,通过以函数定义的顺序按位置发送实参,可以调用打印订单详细信息(例如卖家姓名、订单号和产品名称)的函数。

PrintOrderDetails("Gift Shop", 31, "Red Mug");

如果不记得形参的顺序,但却知道其名称,则可以按任意顺序发送实参。

PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");
PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);

命名实参还可以标识每个实参所表示的含义,从而改进代码的可读性。 在下面的示例方法中,sellerName 不得为 NULL 或空白符。 由于 sellerName 和 productName 都是字符串类型,所以使用命名实参而不是按位置发送实参是有意义的,可以区分这两种类型并减少代码阅读者的困惑。

当命名实参与位置实参一起使用时,只要

1. 没有后接任何位置实参或

PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");

2. 它们用在正确位置。 在以下示例中,形参 orderNum 位于正确的位置,但未显式命名。

PrintOrderDetails(sellerName: "Gift Shop", 31, productName: "Red Mug");

 遵循任何无序命名参数的位置参数无效。

// This generates CS1738: Named argument specifications must appear after all fixed arguments have been specified.
PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");
示例

以下代码执行本节以及某些其他节中的示例。

class NamedExample
{static void Main(string[] args){// The method can be called in the normal way, by using positional arguments.PrintOrderDetails("Gift Shop", 31, "Red Mug");// Named arguments can be supplied for the parameters in any order.PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);// Named arguments mixed with positional arguments are valid// as long as they are used in their correct position.PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");PrintOrderDetails(sellerName: "Gift Shop", 31, productName: "Red Mug"); PrintOrderDetails("Gift Shop", orderNum: 31, "Red Mug");// However, mixed arguments are invalid if used out-of-order.// The following statements will cause a compiler error.// PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");// PrintOrderDetails(31, sellerName: "Gift Shop", "Red Mug");// PrintOrderDetails(31, "Red Mug", sellerName: "Gift Shop");}static void PrintOrderDetails(string sellerName, int orderNum, string productName){if (string.IsNullOrWhiteSpace(sellerName)){throw new ArgumentException(message: "Seller name cannot be null or empty.", paramName: nameof(sellerName));}Console.WriteLine($"Seller: {sellerName}, Order #: {orderNum}, Product: {productName}");}
}
COM 接口

命名实参和可选实参,以及对动态对象的支持大大提高了与 COM API(例如 Office Automation API)的互操作性。

例如,Microsoft Office Excel 的 Range 接口中的 AutoFormat 方法有七个可选形参。 这些形参如下图所示:

但是,可以通过使用命名实参和可选实参来大大简化对 AutoFormat 的调用。 如果不希望更改形参的默认值,则可以通过使用命名实参和可选实参来省略可选形参的实参。 在下面的调用中,仅为 7 个形参中的其中一个指定了值。

var excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Workbooks.Add();
excelApp.Visible = true;var myFormat =Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;excelApp.Range["A1", "B4"].AutoFormat( Format: myFormat );
重载决策

使用命名实参和可选实参将在以下方面对重载决策产生影响:

如果方法、索引器或构造函数的每个参数是可选的,或按名称或位置对应于调用语句中的单个自变量,且该自变量可转换为参数的类型,则方法、索引器或构造函数为执行的候选项。
如果找到多个候选项,则会将用于首选转换的重载决策规则应用于显式指定的自变量。 将忽略可选形参已省略的实参。
如果两个候选项不相上下,则会将没有可选形参的候选项作为首选项,对于这些可选形参,已在调用中为其省略了实参。 重载决策通常首选具有较少形参的候选项。


http://www.ppmy.cn/news/1557608.html

相关文章

对象的状态变化处理与工厂模式实现

一、引言 在 C 编程中,有效地处理对象的状态变化以及合理运用设计模式可以极大地提高代码的可维护性、可扩展性和可读性。本文将深入探讨 C 如何处理对象的状态变化以及如何实现工厂模式。 二、C 中对象的状态变化处理 使用成员变量表示状态 class GameCharacte…

如何注册和使用Facebook企业号

Facebook是全球最大的社交平台之一,不仅为个人用户提供了广泛的社交功能,还为企业和品牌提供了强大的营销工具。企业可以通过Facebook企业号(即Facebook Business Page)展示品牌形象、与潜在客户互动、发布营销活动以及进行广告投…

CS 144 check4: interoperating in the world

Lectures Note 略 Exercises 执行cmake --build build --target check_webget发现超出12s了。 1、回看check0的代码,似乎不需要关闭写入方向,于是注释掉(关键) 2、将request的变量类型从string转为string_view(顺手…

在linux系统的docker中安装GitLab

一、安装GitLab: 在安装了docker之后就是下载安装GitLab了,在linux系统中输入命令:docker search gitlab就可以看到很多项目,一般安装第一个,它是英文版的,如果英文不好可以安装twang2218/gitlab-ce-zh。 …

边缘智能网关助力打造建筑智慧消防物联网

随着经济社会的快速发展,为了满足民众生产、生活、消费需求,高层建筑、大型综合连体建筑持续兴建,各类火灾风险和事故也越发增加。得益于物联网的普及应用,消防监测和管理迎来数字化、智慧化转型升级。 针对各类高层、大型建筑消防…

智尚招聘求职小程序V1.0.18

微信小程序招聘管理系统。支持多城市、人才版块、招聘会、职场资讯、经纪人入驻等功能。提供全部无加密源码,支持私有化部署。 V1.0.18增加功能与修复一些BUG 1、增加过审机制(后台系统设置里开启)2、增加后台经纪派遣人才管理3、优化前端经纪派遣人功能4、修复前…

Springboot logback 日志打印配置文件,每个日志文件100M,之后滚动到下一个日志文件,日志保留30天(包含traceid)

全部配置 logback.xml <?xml version"1.0" encoding"UTF-8"?> <configuration debug"false"><property name"LOG_HOME" value"log"/><property name"LOG_NAME" value"admin"/&g…

uni APP关联服务空间

上报uni APP数据到uni-admin后台&#xff0c;调试出现报错“应用未关联服务空间&#xff0c;统计上报失败&#xff0c;请在uniCloud目录右键关联服务空间” 1、在项目的根目录右键选择创建uniCloud云开发环境会弹出腾讯云/阿里云/支付宝云&#xff0c;我选择的是支付宝云&…