c# - 您应该在 C# 4.0 中使用重载或可选参数来声明方法吗?

标签 c# c#-4.0 overloading optional-parameters

我在看Anders' talk about C# 4.0 and sneak preview of C# 5.0 ,这让我开始思考什么时候 C# 中的可选参数可用,推荐的方法是什么来声明不需要指定所有参数的方法?

例如 FileStream 类有大约 15 个不同的构造函数,它们可以分为逻辑“家族”,例如以下来自字符串的那些,来自 IntPtr 的那些和来自 SafeFileHandle 的那些。

FileStream(string,FileMode);
FileStream(string,FileMode,FileAccess);
FileStream(string,FileMode,FileAccess,FileShare);
FileStream(string,FileMode,FileAccess,FileShare,int);
FileStream(string,FileMode,FileAccess,FileShare,int,bool);

在我看来,这种类型的模式可以通过使用三个构造函数来简化,并对可以默认的参数使用可选参数,这将使不同的构造函数家族更加明显[注意:我知道这种变化不会在 BCL 中制作,我是在假设这种情况下说话]。

你怎么看?从 C# 4.0 开始,将密切相关的构造函数和方法组变成一个带有可选参数的方法是否更有意义,或者是否有充分的理由坚持传统的多重重载机制?

最佳答案

我会考虑以下几点:

  • 您是否需要使用不支持可选参数的语言来使用您的代码?如果是这样,请考虑包括重载。
  • 您的团队中是否有任何成员强烈反对可选参数? (有时候接受一个你不喜欢的决定比争论这个问题更容易。)
  • 您是否确信您的默认值不会在您的代码构建之间发生变化,或者如果它们可能会发生变化,您的调用者会接受吗?

我没有检查默认值是如何工作的,但我假设默认值将被烘焙到调用代码中,与对 const 字段的引用非常相似。这通常没问题 - 对默认值的更改无论如何都非常重要 - 但这些是需要考虑的事情。

关于c# - 您应该在 C# 4.0 中使用重载或可选参数来声明方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251868/

相关文章:

c# - 添加的 Double 值不一致

reflection - 为什么反射不在Struct中设置属性?

c# - 为什么 C# 编译器认为我在使用可空 long 时尝试使用 sbyte 重载?

c# - 重载方法..为什么基类优先?

c# - 序列化类关键字的好处

c++ - 通过交换参数顺序的函数重载

scala - 重载具有多个参数列表的方法是否违法?

c# - 如何使用 DataContractJsonSerializer 将类类型而不是命名空间序列化为 Json 字符串

c# - 在 DataGridView 中选择/取消选择行

c# - 在 C# 中定义可以接受大量参数的函数