“.NET研究”谈谈C# 4.0新特性“缺省参数”的实现

  C#4.0关于缺省参数的新特性,相信大家都不会陌生。所谓缺省参数,顾名思义,就是在声明方法的某个参数的时候为之指定一个默认值,在调用该方法的时候如果采用该默认值,你就无须指定该参数。和很多语言层面特性(语法糖)的实现一样,缺省参数也是编译器为我们玩的一个小花招。缺省参数最终体现为两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute 。

目录
一、缺省参数的用法
二、实现缺省参数的两个特性:OptionalAttribute和DefaultParameterValueAttribute
三、直接通过OptionalAttribute和DefaultParameterValueAttribute 定义缺省参数

  一、缺省参数的用法

  比如下面一个TestMethod方法,后面两个参数bar和baz就是缺省参数,默认值分别为“Bar”和“Baz”。

static void TestMethod(string foo, string bar = "Bar", string baz = "Baz")
{
Console.WriteLine(
"{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
}

  在调用TestMethod的时候,我们自由地选择采用缺省的参数值,或者覆盖该缺省值。

static void Main(string[] args)
{
TestMethod(
"Foo");
TestMethod(
"Foo", "Bar1");
TestMethod(
"Foo", "Bar1", "Baz1");
}

  下面是输出结果:

Foo - Bar - Baz
Foo
- Bar1 - Baz
Foo
- Bar1 - Baz1

  缺省参数的使用有两个简单的限制,其一是:缺省参数的声明只能放在普通参数之后。如下代码中定义的TestMethod方法中,缺省参数bar后面跟一个非缺省参数baz,这样的代码是不能通过编译的(编译错误信息为:Optional parameters must appear after all required parameters)。

上海徐汇企业网站设计与制作>
static void TestMethod(string foo, string bar = "Bar", string baz)
{
Console.WriteLine(
"{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
}

  但是,缺省参数后面可以跟数组参数(params参数),实际上无论在什么情况下,params参数都只能是最后一个声明的参数。关于缺省参数的声明的位置限制,主要重载方法的识别机制决定的,这一点大家都很容易理解。

  缺省参数的另一个限制是:指定的缺省值必须是一个常量,这就实际上为作为缺省参数的数据类型作了限制——只能是系统定义的基元类型。下面定义的TestMethod方法中,我们定义了一个DateTime类型的缺省参数,并将参数缺省值作为DateTime.Now。由于DateTime.Now不是常量,所以这样的代码也不能通过编译(编译错误消息:Default parameter value for 'date' must be a compile-time constant)。

static void TestMethod(DateTime date = DateTime.Now)
{
//Others...
}

  二、实现缺省参数的两个特性:OptionalAttribute和DefaultParameterValueAttribute

  为什么缺省参数的默认值只能接受常量呢?如果你了解了缺省参数的本质,这就不是一个问题。那么缺省参数究竟是如何实现的呢?

  和很多语言层面特性(语法糖)的实现一样,缺省参数也是编译器为我们玩的一个小花招,而真正编译后的东西都是我们再熟悉不过的玩意儿。当包含缺省参数的C#代码经过编译后,缺省参数体现在两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute 。前者将参数标识为缺省参数,后者指定其缺省值。

[ComVisible(true), AttributeUsage(AttributeTargets.Parameter, Inherited=false)]
public sealed class OptionalAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Parameter)]
public sealed class DefaultParameterValueAttribute : Attribute
{
public DefaultParameterValueAttribute(object value);
public object Value {get; }
}

  对于最开始我们定义的TestMethod方法,编译后的形式如下所示。

private static void TestMethod(string foo,
[Optional, DefaultParameterValue(
"Bar")] string bar,
[Optional, DefaultParameterValue(
"Baz")] strin上海闵行企业网站设计与制作g baz)
{
//Others..
}

  正是因为缺省参数的默认值最终是作为DefaultParameterValueAttribute的参数存在的,所以它必须是常量。

  三、直接通过OptionalAttribute和DefaultParameterValueAttribute 定义缺省参数

  既然缺省参数最终体现为OptionalAttribute和DefaultParameterValueAttribute 这两个特性,我们是否可以直接通过它们来定义缺省参数呢?答案是:当然可以,下面的代码一样可以正常执行。

static void Main(string[] args)
{
TestMethod(
"Foo");
TestMethod(
"Foo","Bar1");
TestMethod(
"Foo","Bar1","Baz1");
}

private static void TestMethod(string foo,
[Optional, DefaultParameterValue(
"Bar")] string bar,
[Optional, DefaultParameterValue(
"Baz")] string baz)
{
//Others..
}

  如果调用含有缺省参数的方法,并且没有显示指定该参数,编译器在编译的时候会自动将默认值附加上去。对于上面的Main方法,下面是与之等效的编译后代码。

private static void Main(string[] args)
{
TestMethod(
"Foo", "Bar", "Baz");
TestMethod(
"Foo", "Bar1", "Baz");
TestMethod(
"Foo", "Bar1", "Baz1");
}

  虽然说我们通过OptionalAttribute和DefaultParameterValueAttribute 这两个特性也可上海企业网站设计与制作以定义缺省参数,但是当我们将缺省参数定义在普通参数之前是,编译器不会报错。倒是方法中缺省参数实际上就相当于普通参数了。

static void Main(string[] args)
{
//TestMethod("Foo","Baz");
//上面的方法调用无效
TestMethod("Foo","Bar1","Baz1上海徐汇企业网站制作style='color:white;' href='http://www.93tj.com'>上海网站建设"color: #800000;">");
}
private static void TestMethod(string foo,
[Optional, DefaultParameterValue(
"Bar")] string bar,
string baz)
{
//Others..
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA查看源码时总是出现.class而不是.java源码(解决办法)

自己安装的JDK8里面就有源码,就是图中的src.zip,我还傻乎乎的跑去下。 我参考下面这个链接解决了这个问题: https://www.it610.com/article/1283023085871579136.htm 特别注意其中的一句话:把SDKs中多余的jdk删掉留一个就好&am…

ASP“.NET研究”.NET中的认证与授权

用户认证 .net提供了3种用户认证的方式,分别是Windows,Forms,Passport。这几种形式的定义可以在网站根目录下Web.config中的authentication节点中看见。Windows是默认的验证形式,它是根据机器的访问权限来判断的。Passport是微软提供的一种验…

针对资源管理器文件夹右键一直转圈圈卡死的问题

问题描述 每次打开资源管理器,文件夹右键就会一直转圈圈,转到资源管理器自动退出 解决方法 网上试了很多种方法,都没有解决我的问题,偶然在运行菜单里看到两个根本不是我装的疑似携带病毒类的软件,把他们都卸载之后…

用NuGet掌管你的Vi“.NET研究”sual Studio扩展

如果你使用Visual Studio 2010,那么 NuGet 可以使你的生活更加美好。当你项目里要引用到的一些库时候,比如JQuery 库或者 NHibernate, NUnit, log4net 你就可以考虑使用NuGet。它可以辅助你安装或者更新这些库。 当然我不得不继续说下去从安装到使用&…

cmd窗口使用python提示“Python not found”,可能是环境变量配置的原因

问题1 打开命令行窗口使用python命令无法直接进入python环境,但是从python的安装目录下就可以进去 问题原因 没有配置系统环境变量,需要把python安装路径添加到path环境变量中 环境变量配置,可以参考菜鸟教程 问题2 配置了环境变量之后…

vim 高亮显示php代码

vim是一款跨平台编辑器,可以在linux下使用,也可以在windows下使用高亮显示php代码 进入vim后,在普通模式下输入如下命令,开启php代码高亮显示 WwwChinazcom :syntax enable :source $VIMRUNTIME/syntax/php.vim转载于:https://w…

无法打开caffe.pb.h, no such file or directory错误

问题: 使用VS2013生成caffe解决方案的过程中,出现 无法打开caffe.pb.h,no such file or directory ,解决方案 : 参考博客:[caffe] 无法打开caffe.pb.h, no such file or directory错误 博客地址:https://b…

MusicXML 3.0 (20) - 钢琴踏板

<?xml version"1.0" encoding"UTF-8" standalone"no"?> <!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.0 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd"> <score-partwis…

NuGet Error:Unable to find version ‘0.3.3.0‘ of package ‘glog.overlay-x64_v120_Release_dynamic‘.

问题&#xff1a; 使用VS2013生成caffe解决方案时&#xff0c;报错NuGet Error:Unable to find version 0.3.3.0 of package glog.overlay-x64_v120_Release_dynamic. 解决方案&#xff1a; 一、参考文章里面的回答&#xff1a; 链接&#xff1a;NuGet error while buildin…

【caffe】找不到gpu/mxGPUArray.h

问题原因&#xff1a; Microsoft 的github貌似更新了matcaffe中的caffe_.cpp文件&#xff0c;第十六行添加了对gpu/mxGPUArray.h的引用 解决方法 是将本机Matlab的该文件夹复制到Caffe项目文件的对应位置。 具体方法 在你的matlab文件下面搜索mxGPUArray.h文件&#xff0c…

4 error C2220: 警告被视为错误 - 没有生成“object”文件 (..\..\src\caffe\util\math_functions.cpp)

在VS2013上编译caffe时遇到如下问题&#xff1a; 错误原因&#xff1a; 原因是该文件的代码页为英文&#xff0c;而我们系统中的代码页为中文。 解决方法&#xff1a; 将源码转化为正确的编码方式 用VS2013打开对应的文档&#xff0c;文件->打开->选择该cpp&#xff0…

技术人员如何转型为产品经理

技术人员如何转型为产品经理不知道是不是所有的公司开会都是这样&#xff0c;以时间长短作为衡量会议重要性的标准。周扬被郭姐姐叫去开会&#xff0c;9点半开始&#xff0c;直到快12点了&#xff0c;他才满脸愁容地回到办公室。放下笔记本&#xff0c;周扬站到办公室中间&…

错误 4 error C2220: 警告被视为错误 - 没有生成“object”文件

报错内容&#xff1a; 复制第一行的错误内容&#xff1a; 错误 4 error C2220: 警告被视为错误 - 没有生成“object”文件 D:\Program Files\NugetPackages\boost.1.59.0.0\lib\native\include\boost\format\alt_sstream_impl.hpp 1 1 libcaffe 复制会发现他给出了没有生成obje…

【转】 看IT人才最容易犯的17个错误

记得刚参加工作时&#xff08;那是97年&#xff09;&#xff0c;中国的IT刚刚兴起&#xff0c;那时&#xff0c;作为一个IT人士是一件很光荣的事&#xff0c;而那时的我正在做电气和电子相关的工作。99年第一次跳 槽&#xff0c;进入了IT行业做软件开发。至今&#xff0c;中国的…

未定义变量或函数caffe_()

该错误是使用matlab 运行classification_demo产生的 三要素仔细检查 一、添加系统环境变量 把 \caffe-master\Build\x64\Release添加到系统环境变量中 二、添加 Caffe 路径 打开 MATLAB&#xff0c;在命令窗口输入pathtool&#xff0c;添加 Caffe 路径&#xff0c;主要是添…

围观窗体与组件03 - 零基础入门学习Delphi25

围观窗体与组件03 让编程改变世界 Change the world by program 围观按钮型组件 Button、BitBtn、SpeedButton的一些区别 区别一&#xff1a;Button 不能显示位图 区别二&#xff1a;SpeedButton 没有焦点&#xff0c;一般用于工具栏按钮 区别三&#xff1a;BitBtn 有 kind…

windows下使用Caffe框架和matlab实现SRCNN官方代码的步骤

步骤 step1 搭建caffe环境 在windows系统上搭建caffe环境&#xff0c;并配置matlab接口&#xff08;需要下载 caffe-master.zip 以及 VS2013 &#xff09; 我的环境为&#xff1a;windows10 caffe-master VS2013旗舰版 matlab R2018b 安装步骤推荐参考&#xff1a; 博客1…

OCP之5 管理数据库存储结构

存储结构 一个数据库可划分为多个称为表空间的逻辑存储单元。每个表空间可以包含很多Oracle 逻辑数据块。DB_BLOCK_SIZE 参数指定了逻辑块的大小。逻辑块的大小介于2 KB 到 32 KB 之间&#xff0c;默认大小为8 KB。特定数目的相邻逻辑块构成了一个区。为特定逻辑结构分配的一组…

LaTeX的安装教程及问题记录

安装教程 我的安装过程参考的博客&#xff1a; LaTeX的安装教程&#xff08;Texlive 2020 TeX studio&#xff09; 遇到的问题 TLUtils::install_packages: Failed to install texlive.infra.win32 Installation failed. 解决办法&#xff1a; 将安装包解压路径全部放置在英…

libsvm数据缩放方法

assumption: min index of attributes is 1 pass 1: find out max index of attributes &#xff1a; 1.1也就是找出每行有多少个特征数据&#xff0c;因为libsvm特征格式中每个特征前面带有下标&#xff0c;缺失的认为是0&#xff0c;这样避免稀疏矩阵&#xff0c;以提高计算速…