CA1026(所有参数应具有默认值)和扩展方法

Rob*_*ean 19 c# extension-methods code-analysis fxcop

前提

使用带有C#可选参数的代码分析(或fxCop)时,您可以收到CA1026的警告.对此的简短原因1不是使用默认值来提供所有参数.

下面的声明正确地生成了此警告

public Color GetColor(bool red, bool blue = true, bool green = true)
Run Code Online (Sandbox Code Playgroud)

但是,有一种情况是您无法使用默认值提供所有参数,这就是扩展方法.因此,下面的声明会因为第一个参数而生成警告:

public static bool ValidateRules(this string s, Rules rules = Rules.Default)
Run Code Online (Sandbox Code Playgroud)

编译器不允许您在this参数上指定默认值,因此只有两个解决方案是:

  1. 忽略警告,我不喜欢这样做,因为它会导致不良做法.
  2. 不使用扩展方法,我不喜欢这样做,因为我发现扩展方法使代码更易读.

问题

  • 以上两个选项是解决这个问题的唯一方法吗?
  • fxCop/Code Analysis在检查中是否不正确?

  1. 长期的原因

Jon*_*eet 34

这不是警告你不具有默认的所有参数-这是警告你使用可选参数在所有.

我个人会禁用这个特别的警告.小心使用时,我认为可选参数很好.你应该仔细思考他们认为特别是在默认参数值的版本控制方面在不支持这些语言(包括V4之前,C#)方面,但在许多环境中的缺点真的不是一个问题-你可以结束使用比在整个地方指定重载更简单的代码.

  • "在版本控制方面":Phil Haack [在这里讨论这个问题](http://haacked.com/archive/2010/08/10/versioning-issues-with-optional-arguments.aspx). (6认同)
  • 版本是可选参数问题的*最少* - 更糟糕的是它们通过破坏封装导致的可维护性问题.不可能正确地包装带有可选参数的方法,所以人们只是不这样做(或者通过重复参数及其遍布的地方来做坏事).我真的不认为这个警告应该全局禁用.最好使用带有或不可以设置的字段的结构/类. (2认同)