在面向对象编程中,使用默认参数是一种不好的实践吗?

11

方法的默认参数是否违反了封装性?

C#不提供默认参数的原因是什么?


我理解你的问题是“来自无处的神秘事物对我的代码有害吗?”。我只是无法接受一个如此优秀的语言C#允许使用这个可选参数GARBAGE。 - Sharky
7个回答

11

我会将这个作为微软的“官方”答案。但是,在C# 4.0中,默认参数(和命名参数)肯定会被提供。


3
不,它并不会以任何方式影响封装性。它只是通常情况下不必要的。通常,创建一个接受较少参数的重载函数是更灵活和更清晰的解决方案,因此C#的设计者认为没有必要将默认参数的复杂性添加到语言中。
“另一种做同样事情的方法”总是有利弊得失的。在某些情况下,这可能很方便。但是,你让语法合法的越多,语言就变得越复杂,学习成本也就越高,而且你可能会自己限制了未来的扩展。(也许他们有一天会想出一种类似语法的语言扩展。那么,由于与早期添加的功能冲突,这个扩展就无法添加了)

2
正如已经指出的那样,默认参数不是一个优先考虑的功能,但很可能会在C# 4.0中添加。然而,我相信之前没有包括它有很好的理由(在4.0中,据我所知,主要是为了支持鸭子类型编程风格,其中默认参数增加了类型兼容性)。
我认为过多的参数列表(特别是超过4-5个不同参数)是一种代码异味。默认参数本身并不是邪恶的,但会冒险鼓励不良设计,并延迟将其重构为更多对象的过程。

1
关于你的第一个问题 - 不,这与提供多个重载构造函数完全相同。至于第二个问题,我无法回答。

1

C# 4.0 将包含默认参数

一些相关阅读材料:

点击查看

点击查看

此外,本篇文章的作者似乎将在不久的将来发表一篇关于为什么 MS 选择在 C# 中实现默认参数的文章。


1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接