当前位置:  开发笔记 > 编程语言 > 正文

是否重载在C#中拥有默认函数参数的唯一方法?

如何解决《是否重载在C#中拥有默认函数参数的唯一方法?》经验,为你挑选了2个好方法。

处理默认函数参数的唯一方法是通过函数重载吗?

例如,在PHP中我可以这样做:

function foo($x, $y=0)
{
}

在C#中处理它的最佳方法是这样吗?

void foo(int x)
{
  foo(x, 0);
}

void foo(int x, int y)
{
}

示例从此处解除

编辑

将C#示例变成了实际的C#(感谢Blair Conrad)



1> Giovanni Gal..:

只是为了满足一些好奇心:

从什么不C#支持默认参数?:

在C++等语言中,默认值可以作为方法声明的一部分包含在内:

void Process(员工员工,bool bonus = false)

可以使用以下方法调用此方法:

a.Process(员工,真实);

要么

a.Process(雇员);

在第二种情况下,参数奖励设置为false.

C#没有此功能.

我们没有此功能的一个原因与功能的特定实现有关.在C++世界中,当用户写道:

a.Process(雇员);

编译器生成

a.process(employee,false);

换句话说,编译器采用方法原型中指定的默认值并将其放入方法调用中 - 就像用户将'false'写为第二个参数一样.没有强制类的用户重新编译就无法更改默认值,这是不幸的.

在这方面,重载模型效果更好.框架作者只定义了两个单独的方法,单参数方法调用了双参数方法.这将保留框架中的默认值,必要时可以在其中进行修改.

编译器可以采用类似C++定义的东西并产生重载,但是这种方法存在一些问题.

第一个是用户编写的代码与编译器生成的代码之间的关联不太明显.我们通常尽可能地限制魔法,因为它使程序员更难.第二个问题与XML文档注释和智能感知等问题有关.编译器必须对如何为重载方法生成doc注释有特殊规则,而intellisense需要智能将重载方法折叠到单个方法中.

自己编写超载有点不方便,但我们认为这是一个可以接受的解决方案.



2> Blair Conrad..:

是的,这是最好的,除非你$在参数名称上省略了s,正如其他人所指出的那样.对于那些对缺乏默认参数值背后的基本原理感兴趣的人,请参阅@Giovanni Galbo的解释.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有