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

.NET Blog上最近新贴子的数目有减少的趋势。我觉得每个人都应该勤快一点,分享自己经验和想法,别让这个Blog衰落下去。

VB从4.0开始支持“可选参数”这一特性。就是说,函数或子程序的参数有些是可选的,调用的时候可以不输入。其实VB从1.0开始就有一些函数带有可选参数,只不过到了4.0才让用户自己开发这样的过程。在VB4里,可选参数可以不带默认值,而在VB.NET里,如果使用可选参数,则必须带有默认值。如

Public Sub TestOptional(Optional i As Integer = 1)

End Sub

调用的时候,既可以写成TestOptional(2),也可以写成TestOptional(),这种情况参数i自动等于1。如果过程有不止一个可选参数,则VB还提供一种简化操作的方法——按名传递参数。比如过程

Public Sub TestOptional(Optional i As Int32 = 1, Optional j As Int32 = 1, Optional k As Int32 = 1)

End Sub

如果只想指定k,让i和j使用默认值,就可以使用按名传递,如下

TestOptional(k := 2)

而且这种方式不受参数表顺序的限制

TestOptional(k := 2, i := 3, j := 5)

这些的确是相当方便的功能,C#就不支持上述两个特性。我们看看它是怎样在IL级别实现的。上述第一个方法在IL中的定义为

.method public instance void TestOptional([opt] int32 i) cil managed
{
.param [1] = int32(0x00000001)
.maxstack 8

可见,参数被加上了[opt]修饰符,而且.param指定了参数的默认值。这是只有VB能识别的内容,C#会跳过他们。在调用的时候,VB若发现参数被省略,则自动读取.param部分的默认值,并显式传递给过程。这一部分完全由编译器处理,而且没有任何性能损失,和手工传递所有参数是完全一样的。至于按名传递,VB会自动调整参数的顺序,其结果与传统方式的传递也没有任何的不同。这说明我们可以放心地使用这项便利。而且带有可选参数的过程拿到C#中,顶多变成不可选参数,也不会造成什么其他的麻烦。

PS.很多COM组件都使用了默认参数,而且有些过程的参数列表非常长,在VB里可以轻松地处理它们,而在C#中经常让开发者传参数传到吐血

时间: 2025-01-07 18:59:58

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

vb.net 函数或子程序的可选参数如何 传递color?

问题描述 问题,vb.net函数或子程序的可选参数如何传递color?SubchangebBackcolor(OptionalbackcolorAsColor=Color.Black)......EndSub 我这样写报错,高手能给指正一下吗? 解决方案 解决方案二:用重载吧,可选参数必须是常量解决方案三:回复shingoscar:我该如何使用重载呢?(我是新手)能贴下代码吗解决方案四:重载,就是几个函数的名称相同而参数不同.解决方案五:回复zj_zwl:谢谢,我再研究研究.解决方案六:或者把颜

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

1.命名参数允许调用者通过提供参数的名称来为其赋值,这样参数的位置就不在重要了.可选参数允许在定义时为某些参数赋值,在调用时可以忽略这些"可选的"参数.命名参数和可选参数可以应用在方法.索引器.构造函数和委托.命名参数和可选参数与dynamic类型结合在一起使用,可以方便的访诸如Office自动化API之类的COM API. 1.1 命名参数 命名参数的语法为: 参数名称1:参数值1,参数名称2:参数值2- 例如以下代码: 以下为引用的内容: static void Main(stri

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

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

jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象_jquery

Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 本文演示的是:jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象 ajaxForm()和ajaxSubmit()的可选参数项对象 ajaxForm 和 ajaxSubmit 都支持大量的可选参数,它们通过可选参数项对象传入.可选参数项对象只是一个简单的 JavaScript对象,里边包含了一些属性和一些值:

WCF有可选参数么?

问题描述 平常的方法PublicvoidTest(stringA,stringB="1")参数B可传可不传,可是在WCF中如何实现? 解决方案 解决方案二:那你就重载一个不就可以了么.解决方案三:你可以将契约单独出来,同时供服务端客户端用,这样你就可以用可选了,wcf好像还支持默认值,但忘了解决方案四:引用1楼wyd1520的回复: 那你就重载一个不就可以了么. WCF重载客户端显示的方法名就变了没有意义!解决方案五:不用太纠结于可选参数吧,用两个方法呗

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

一起谈.NET技术,可选参数在.NET中全面开花

.NET一直都支持可选参数,但是C#语言却并不支持,除了调用COM库以外,可选参数通常是被禁止使用的.现在,随着C# 4对可选参数的支持,我们可以看到可选参数被越来越多的使用,而不仅仅限于遗留代码中.这些应用包括与动态语言的互操作.只读数据类型,以及ASP.NET MVC中的许多地方. 显然,COM仍然是可选参数的主要用武之地.例如,当你使用Office库时,某个函数可能会有超过20个参数,手动指定每一个参数是非常不方便的.如果再没有辅助的标记,你就只能通过数参数的个数来确定哪个值对应的是哪个参

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

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