带有可选参数的版本控制问题

时间:2018-10-10 05:06:01

标签: c# versioning optional-parameters

我正在阅读article,内容涉及版本更改时可选参数如何中断。

在这里释义。

让我们看一下这两个概念在工作中的简要示例。假设  我们有一个带有以下签名的方法的类。

   // v1
   public static void Redirect(string url, string protocol = "http");

此假设库包含一个采用两个方法的方法  参数,必需的字符串url和可选的字符串协议。

以下显示了调用此方法的六种可能方式。

 HttpHelpers.Redirect("https://haacked.com/");
 HttpHelpers.Redirect(url: "https://haacked.com/");
 HttpHelpers.Redirect("https://haacked.com/", "https");
 HttpHelpers.Redirect("https://haacked.com/", protocol: "https");
 HttpHelpers.Redirect(url: "https://haacked.com/", protocol: https");
 HttpHelpers.Redirect(protocol: "https", url: https://haacked.com/");

请注意,参数是否可选,您可以选择  是否通过名称引用参数。在最后一种情况下,请注意  参数指定不正确。在这种情况下,使用named  参数是必需的。

下一版本

使用可选参数的一个明显好处是您可以  减少API的重载次数。但是,依靠  可选参数的确有其特殊之处,您需要注意何时  涉及版本控制。

假设我们已经准备好制作令人敬畏的第二版  HttpHelpers库,我们在现有库中添加一个可选参数  方法。

 // v2
 public static void Redirect(string url, string protocol = "http",   bool permanent = false);

当我们尝试执行客户端而不重新编译客户端时会发生什么  客户应用程序?

我们收到以下异常消息。

      Unhandled Exception: System.MissingMethodException: Method not found: 'Void HttpLib.HttpHelpers.Redirect(System.String,
  System.String)'....

我对为什么此更改会中断部署而不是重新编译的更改感到困惑。

更改了包含可选参数的方法签名后,它应该仍然有效吗?即使我们不重新编译客户端应用程序,因为这是一个可选参数。

1 个答案:

答案 0 :(得分:0)

您的代码需要重新编译,以便编译器可以生成对带有三个参数的新方法的调用。可选方法只是语法糖,当您不提供可选参数时,编译器会为您传递默认值。但是,如果不重新编译代码,就不会发生这种情况,并且您将尝试用两个参数调用方法,而期望使用三个参数。