代码之家  ›  专栏  ›  技术社区  ›  Robert MacLean

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

  •  19
  • Robert MacLean  · 技术社区  · 15 年前

    前提

    当使用代码分析(或fxCop)和C#可选参数时,您可能会收到以下警告: CA1026 1 因此,不是所有参数都提供默认值。

    public Color GetColor(bool red, bool blue = true, bool green = true)
    

    public static bool ValidateRules(this string s, Rules rules = Rules.Default)
    

    编译器不允许您为此参数指定默认值,因此只有两种解决方案:

    1. 忽略这个警告,我不喜欢这样做,因为它会导致不好的做法。

    问题

    • 怎么解决这个问题?
    • 是fxCop/Code 检查时分析不正确?

    1. The long reason
    2 回复  |  直到 15 年前
        1
  •  34
  •   Jon Skeet    15 年前

    全部的 完全 .

    我个人会禁用这个特别的警告。小心使用时,我认为可选参数很好。您应该仔细考虑它们,特别是在默认参数值的版本控制方面 对于不支持它们的语言(包括v4之前的C语言),但在许多环境中,缺点并不是问题所在—最终得到的代码比到处指定重载要简单得多。

        2
  •  1
  •   Steven Sudit    15 年前

        3
  •  1
  •   marc_s    6 年前

    我在jonskeet的回答中缺少的一个论点也是关于可维护性的:默认值总是用它在IL(中间语言)中的值填充。如果使用外部库,这是一个问题。

    下面是重现一个简单示例的步骤:

    1. 创建控制台应用程序
    2. 添加 ClassLibrary
    3. 添加以下代码:

    程序.cs

    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var obj = new Class1();
    
                Console.WriteLine(obj.Foo());
                Console.ReadKey();
            }
        }
    }
    

    namespace ClassLibrary1
    {
        public class Class1
        {
            public string Foo(string str = "http")
            {
                return str;
            }
        }
    }
    

    如果您运行它,您将看到“http”,正如预期的那样。

    1. 现在将“http”改为“https”
    2. 只编译库(甚至可能卸载控制台项目)
    3. 用手
    4. 运行控制台应用程序 ,而不是来自VS内部!

    你还会看到的 http http协议

    因此,如果外部库被更新,请始终重新编译代码。或者不使用默认值。

    只需创建一个单独的方法:

            public string Foo()
            {
                return Foo("https");
            }
    
            public string Foo(string str)
            {
                return str;
            }