马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。1.定名参数同意挪用者经由过程供应参数的称号来为其赋值,如许参数的地位就不在主要了。可选参数同意在界说时为某些参数赋值,在挪用时能够疏忽这些“可选的”参数。定名参数和可选参数能够使用在办法、索引器、机关函数和托付。定名参数和可选参数与dynamic范例分离在一同利用,能够便利的访诸如Office主动化API之类的COMAPI。1.1定名参数
定名参数的语法为:
参数称号1:参数值1,参数称号2:参数值2…
比方以下代码:
以下为援用的内容:- staticvoidMain(string[]args){CreateUser(password:"adminpassword",name:"admin");}staticvoidCreateUser(stringname,stringpassword){Console.WriteLine("name:{0},password:{1}",name,password);}
复制代码 能够看到因为在挪用时利用了定名参数,参数的地位就不在主要了。
1.2.可选参数
办法、机关函数、索引器和托付的界说能够指定其参数为必选的仍是可选的,在挪用时必需供应必选参数,可是能够省略可选参数。
还可使用System.Runtime.InteropServices.OptionalAttribute特征类界说可选参数,该类从1.0时期就已包括在基类库中了。
每个可选参数的界说都包括默许值(默许值必需是常量),假如在挪用时没有指定该参数,则利用默许值。比方以下代码:
以下为援用的内容:
staticvoidMain(string[]args)
{
CreateUser("admin","adminpassword",50);
}
///
///创立用户
///
///用户称号
///用户暗码
///积分
///是不是锁定
staticvoidCreateUser(stringname,stringpassword,
intscore=20,boolisLocked=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.COMAPI会见
定名和可选参数与dynamic和其他加强一同使得会见COMAPI加倍便利。比方在C#3.0或更早的版本中在挪用某些COMAPI时,假如要省略某些参数必要利用Type.Missing,比方以下代码(代码系摘抄):
以下为援用的内容:
varexcelApp=newMicrosoft.Office.Interop.Excel.Application();
varmyFormat=
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);
复制代码 [/code]2.范例等价撑持(TypeEquivalenceSupport)(此段为翻译)
假如嵌进来自于强定名托管程序集的范例信息时,可使在某一使用程序中的范例与自力的公布版本中范例坚持松懈的毗连。这意味着使用程序能够在不必要从头编译每个版本的情形下利用多个版本托管类库中的范例。
范例嵌进常常用于COM交互,比方利用MicrosoftOffice中的主动化的使用程序。嵌进范例信息同意统一个使用程序在安装了分歧的Office版本的呆板上运转。并且开辟职员能够在完整托管办理计划中利用范例嵌进。
来自于某个程序中能够嵌进的范例必要满意以下前提:
该程序集最少表露一个大众接口。
该嵌进接口利用ComImport和Guid特征声明
该程序集利用ImportedFromTypeLib和一个程序集级其余Guid特征标注(默许情形下VisualBasic和VisualC#模版已包括了程序集的Guid特征)。
在指定能够嵌进的大众接口后,能够创立完成了这些接口的类。客户端程序能够在计划时援用包括了这些大众接口的程序何而且默许EmbedInteropTypes属性为true以嵌进范例信息(在命令利用用/link编译开关能够到达不异的效果),接上去客户端能够创立这些接口的实例。假如您创立了强定名运转时程序集的新版本,客户端不必要利用新的程序集从头编译,相反,客户端程序经由过程大众接口的嵌进范例信息持续利用可用的程序集的版本。
2.1.起首创立一个强定名接口类库(依据满意前提设置属性)
以下为援用的内容:- [ComImport][Guid("8DA56996-A151-4136-B474-32784559F6DF")]publicinterfaceISampleInterface{voidGetUserInput();stringUserInput{get;}}
复制代码2.2.创立强定名类库,援用接口类库并界说完成以上接口的类:
以下为援用的内容:
publicclassSampleClass:ISampleInterface
{
privatestringp_UserInput;
publicstringUserInput{get{returnp_UserInput;}}
publicvoidGetUserInput()
{
Console.WriteLine("Pleaseenteravalue:");
p_UserInput=Console.ReadLine();
}
}
2.3.创立客户端使用程序,援用接口并利用反射的办法静态创立范例实行响应操纵:
以下为援用的内容:
classProgram
{
staticvoidMain(string[]args)
{
AssemblysampleAssembly=Assembly.Load("TypeEquivalenceRuntime");
ISampleInterfacesampleClass=
(ISampleInterface)sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass");
sampleClass.GetUserInput();
Console.WriteLine(sampleClass.UserInput);
Console.WriteLine(sampleAssembly.GetName().Version.ToString());
Console.ReadLine();
}
}
4.修正完成了接口在的客户端类,增添新的办法并修正程序集版本号和文件版本号为2.0.0.0:
以下为援用的内容:- publicDateTimeGetDate(){returnDateTime.Now;}
复制代码 5.再次实行客户端程序,察看分歧(客户端将输入新的版本号)。
在.NET全体利用托管代码创立的程序集主动会辨认更新,也就是说不必要利用分外的属性界说,间接创立接口、完成接口类库和客户端类(大概没有接口间接创立类库在客户端援用),在类库更新后复制到客户端援用的地位,客户端会主动检测到该更新,这也是.NET程序集为开辟职员带来的优点。可是利用范例等价撑持的感化表现在甚么中央,我以为仍是便利了COMAPI的会见,由于COM多是利用其他言语编写的,没有举措做到像.NET程序集那样主动感到版本变更,团体定见,希冀妙手解答。
3.总结
VisualC#中供应了静态范例、定名参数、可选参数和范例等价撑持,为编程带来便当,关于会见COMAPI来讲更便利了。并且微软屡次提到了诸如Office之类的笔墨,是否是意味着微软在不休的勉励程序员不休开辟出其于Office的一些使用,亦或是如今其于Office的使用在不休增添,仍是使用程序中与Office的交互在不休增添,经由过程加强的特征使这些事情更便利,来牢固微软件位置?一家之言,请妙手不惜见教。
无论谁倒了对双方阵营的粉丝们也是有害无益。 |