C# 2010命名和可选参数的新特性

1.命名参数允许调用者通过提供参数的名称来为其赋值,这样参数的位置就不在重要了。可选参数允许在定义时为某些参数赋值,在调用时可以忽略这些“可选的”参数。命名参数和可选参数可以应用在方法、索引器、构造函数和委托。命名参数和可选参数与dynamic类型结合在一起使用,可以方便的访诸如Office自动化API之类的COM API。

1.1 命名参数

命名参数的语法为:

参数名称1:参数值1,参数名称2:参数值2…

例如以下代码:


以下为引用的内容:

static void Main(string[] args){CreateUser(password:"adminpassword",name:"admin");}

static void CreateUser(string name, string password)
{
Console.WriteLine("name:{0},password:{1}", name, password);
}

可以看到由于在调用时使用了命名参数,参数的位置就不在重要了。

1.2. 可选参数

方法、构造函数、索引器和委托的定义可以指定其参数为必选的还是可选的,在调用时必须提供必选参数,但是可以省略可选参数。

还可以使用System.Runtime.InteropServices.OptionalAttribute特性类定义可选参数,该类从1.0时代就已经包含在基类库中了。

每一个可选参数的定义都包含默认值(默认值必须是常量),如果在调用时没有指定该参数,则使用默认值。例如以下代码:


以下为引用的内容:

static void Main(string[] args)
{
CreateUser("admin","adminpassword",50);
}

 

///
/// 创建用户
///
///
用户名称
///
用户密码
///
积分
///
是否锁定
static void CreateUser(string name, string password,
int score=20,bool isLocked=false)
{
Console.WriteLine("name:{0},password:{1}", name, password);
}

在所有必须参数后面定义可选参数,如果在调用时提供了某个可选参数的值,那么必须提供该可选参数之前所有可选参数的值(如果此参数之前有可选参数),而不允许使用逗号分隔的形式提供参数,即以下调用是错误的:

CreateUser(“admin”,“adminpassword”,,true);

而必须写成:

CreateUser(“admin”,“adminpassword”,20,true);、

或者更好的解决办法是使用命名参数:

CreateUser(“admin”,“adminpassword”,isLocked:true);

1.3. COM API访问

命名和可选参数与dynamic和其他增强一起使得访问COM API更加方便。例如在C#3.0或更早的版本中在调用某些COM API时,如果要省略某些参数需要使用Type.Missing,例如以下代码(代码系摘抄):


以下为引用的内容:

var excelApp = new Microsoft.Office.Interop.Excel.Application();
var myFormat =
Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;

 

excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

但是有了命名和可选参数后,可以很简单的写成这样:



以下为引用的内容:

excelApp.get_Range("A1", "B4").AutoFormat( Format: myFormat );

2. 类型等价支持(Type Equivalence Support)(此段为翻译)

如果嵌入来自于强命名托管程序集的类型信息时,可以使在某一应用程序中的类型与独立的发布版本中类型保持松散的连接。这意味着应用程序可以在不需要重新编译每一个版本的情况下使用多个版本托管类库中的类型。

类型嵌入经常用于COM交互,例如使用Microsoft Office中的自动化的应用程序。嵌入类型信息允许同一个应用程序在安装了不同的Office版本的机器上运行。而且开发人员可以在完全托管解决方案中使用类型嵌入。

来自于某个程序中可以嵌入的类型需要满足以下条件:

该程序集至少暴露一个公共接口。

该嵌入接口使用ComImport和Guid特性声明

该程序集使用ImportedFromTypeLib和一个程序集级别的Guid特性标注(默认情况下Visual Basic和Visual C#模版已包含了程序集的Guid特性)。

在指定可以嵌入的公共接口后,可以创建实现了这些接口的类。客户端程序可以在设计时引用包含了这些公共接口的程序何并且默认Embed Interop Types属性为true以嵌入类型信息(在命令行使用/link编译开关可以达到相同的效果),接下来客户端可以创建这些接口的实例。如果您创建了强命名运行时程序集的新版本,客户端不需要使用新的程序集重新编译,相反,客户端程序通过公共接口的嵌入类型信息继续使用可用的程序集的版本。

2.1. 首先创建一个强命名接口类库(根据满足条件设置属性)


以下为引用的内容:

[ComImport][Guid("8DA56996-A151-4136-B474-32784559F6DF")]public interface ISampleInterface{void GetUserInput();string UserInput { get; }}

2.2. 创建强命名类库,引用接口类库并定义实现以上接口的类:


以下为引用的内容:

public classSampleClass: ISampleInterface
{
private stringp_UserInput;
public stringUserInput { get{ return p_UserInput; } }

 

    public voidGetUserInput()
{
Console.WriteLine("Please enter a value:");
p_UserInput = Console.ReadLine();
}
}

2.3. 创建客户端应用程序,引用接口并使用反射的方法动态创建类型执行相应操作:


以下为引用的内容:

class Program
{
static void Main(string[] args)
{
Assembly sampleAssembly = Assembly.Load("TypeEquivalenceRuntime");
ISampleInterface sampleClass =
(ISampleInterface)sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass");
sampleClass.GetUserInput();
Console.WriteLine(sampleClass.UserInput);
Console.WriteLine(sampleAssembly.GetName().Version.ToString());
Console.ReadLine();
}
}

4. 修改实现了接口在的客户端类,增加新的方法并修改程序集版本号和文件版本号为2.0.0.0:


以下为引用的内容:

public DateTime GetDate(){return DateTime.Now;}

5. 再次执行客户端程序,观察不同(客户端将输出新的版本号)。

在.NET全部使用托管代码创建的程序集自动会识别更新,也就是说不需要使用额外的属性定义,直接创建接口、实现接口类库和客户端类(或者没有接口直接创建类库在客户端引用),在类库更新后复制到客户端引用的位置,客户端会自动检测到该更新,这也是.NET程序集为开发人员带来的好处。但是使用类型等价支持的作用体现在什么地方,我认为还是方便了COM API的访问,因为COM可能是使用其他语言编写的,没有办法做到像.NET程序集那样自动感应版本变化,个人意见,期望高手解答。

3. 总结

Visual C#中提供了动态类型、命名参数、可选参数和类型等价支持,为编程带来便利,对于访问COM API来说更方便了。而且微软多次提到了诸如Office之类的文字,是不是意味着微软在不断的鼓励程序员不断开发出其于Office的一些应用,亦或是现在其于Office的应用在不断增加,还是应用程序中与Office的交互在不断增加,通过增强的特性使这些工作更方便,来巩固微软件地位?一家之言,请高手不吝赐教。
 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端
, 接口
, 程序
, 参数
, 类型
, 版本
, api嵌入企业邮箱c#
, 可选参数
, 8新特性方法引用
, 嵌入类型
, 命名参数
AutoFormat
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-10-06 23:57:33

C# 2010命名和可选参数的新特性的相关文章

Visual C# 2010新特性之命名和可选参数与类型等价支持

1. 命名和可选参数 Visual C# 2010引入了命名和可选参数,经常使用SQL Server编写存储过程的开发人员对此应该比较熟 悉-命名参数和可选参数与存储过程的参数十分相似. 命名参数允许调用者通过提供参数的名称来为其赋值,这样参数的位置就不在重要了.可选参数允许 在定义时为某些参数赋值,在调用时可以忽略这些"可选的"参数.命名参数和可选参数可以应用在方法 .索引器.构造函数和委托.命名参数和可选参数与dynamic类型结合在一起使用,可以方便的访诸如 Office自动化A

VB.NET是怎样做到的(七)——可选参数和按名传递

.NET Blog上最近新贴子的数目有减少的趋势.我觉得每个人都应该勤快一点,分享自己经验和想法,别让这个Blog衰落下去. VB从4.0开始支持"可选参数"这一特性.就是说,函数或子程序的参数有些是可选的,调用的时候可以不输入.其实VB从1.0开始就有一些函数带有可选参数,只不过到了4.0才让用户自己开发这样的过程.在VB4里,可选参数可以不带默认值,而在VB.NET里,如果使用可选参数,则必须带有默认值.如 Public Sub TestOptional(Optional i As

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

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

JDK5.0新特性--可变参数

/** * 可变参数 */ public class VariableParamater { /** * 统计2个或多个数的和 */ public static void main(String[] args) { //计算2个数的和 sum(10,15); /* * 问题:如果要计算3个数.4个数.5个数或n个数的和,那我们不是要写n个相同的方法,传递n个参数进行累加? * 注:在同一个类中有多个方法的名字相同,且参数列表不同(参数个数.参数类型),称之为方法重载(method overloa

一起谈.NET技术,谈谈C# 4.0新特性“缺省参数”的实现

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

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

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

C# 方法的可选参数、命名参数

原文 http://www.cnblogs.com/lonelyxmas/admin/EditPosts.aspx?opt=1    C#方法的可选参数是.net 4.0最新提出的新的功能,对应简单的重载可以使用可选参数和命名参数混合的形式来定义方法:这样就可以很高效的提供代码的运行效率!          设计一个方法的参数的时,可为部分或全部参数分配默认值.调用其方法时,可以重新指定分配了默认值的参数,也可以使用默认值 重新指定分配默认值的参数时,可以显式地为指定参数名称赋值,隐式指定的时候

C# 4.0命名参数和可选参数

虽然4.0有了新特性. Named And Optional Arguments - 命名参数和可选参数 public partialclass NamedAndOptionalArguments : System.Web.UI.Page     {         protectedvoid Page_Load(object sender, EventArgs e)         {             Write("hello");             Write(&qu

你欺骗了我,可选参数必须位于所有参数最后

前言 有时候不得不感叹中国的文化确实是博大精深,你稍有不慎就会误入歧途,到最终迷茫过后,回过头来再看,哦 ,原来是这个意思,所以说每一字每一句都得仔细斟酌,为什么要这样说,请看我以为的! 话题 在控制台中写一个方法如下 1 static int OptionParam(int a = 0, int b, int c) 2 { 3 return a + b + c; 4 } 然后再控制台调用方法  Console.WriteLine(OptionParam(0, 1, 2)); 进行输入,很显然会