使用带有C#可选参数的代码分析(或fxCop)时,您可以获得CA1026的警告。简短的原因1并不是使用默认值来提供所有参数。
下面的声明正确地生成了此警告
public Color GetColor(bool red, bool blue = true, bool green = true)
但是,有一种情况是您无法使用默认值提供所有参数,这就是扩展方法。因此,下面的声明会因为第一个参数而生成警告:
public static bool ValidateRules(this string s, Rules rules = Rules.Default)
编译器不允许您在this参数上指定默认值,因此只有两个解决方案是:
它不会警告您没有所有参数的默认值 - 它会警告您使用可选参数。
我个人会禁用这个特别的警告。小心使用时,我认为可选参数很好。您应该仔细考虑它们,特别是在默认参数值的版本控制方面以及不支持它们的语言方面(包括v4之前的C#),但在许多环境中,缺点确实不是问题 - 您可以结束使用比在整个地方指定重载更简单的代码。
您可以根据具体情况禁止警告。
我在Jon Skeet的答案中遗漏的一个论点也是关于可维护性:默认值总是用IL(中间语言)中的值填充。如果您使用外部库,这是一个问题。
以下是重现一个简单示例的步骤:
ClassLibrary
项目Program.cs中
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var obj = new Class1();
Console.WriteLine(obj.Foo());
Console.ReadKey();
}
}
}
在你的Class1.cs
namespace ClassLibrary1
{
public class Class1
{
public string Foo(string str = "http")
{
return str;
}
}
}
如果你运行它,你会看到'http',如预期的那样。
你仍会看到http
!使用ILSpy,您可以看到http
在控制台应用程序中是硬编码的。
在这种情况下,如果开发人员认为他是安全的,可以通过将默认值中的“http”替换为“https”来导致安全问题。
因此,如果更新外部库,则始终再次编译代码。或者只是不要使用默认值。
只需创建一个单独的方法:
public string Foo()
{
return Foo("https");
}
public string Foo(string str)
{
return str;
}