可选参数的版本控制问题
Versioning Issues With Optional Arguments
我正在阅读有关版本控制更改时可选参数如何中断的 article。
在这里转述一下。
让我们看一下这两个概念在工作中的快速示例。认为
我们有一个 class,其中一种方法具有以下签名。
// 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/");
注意参数是否可选,你可以选择
是否按名称引用参数。在最后一种情况下,请注意
参数是乱序指定的。在这种情况下,使用命名
参数是必需的。
下一个版本
使用可选参数的一个明显好处是您可以
减少 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)'....
我很困惑为什么这个更改会破坏部署而不是重新编译的更改。
更改包含可选参数的方法签名后它应该仍然有效,不是吗?即使我们不重新编译客户端应用程序,因为这是一个可选参数。
您的代码需要重新编译,以便编译器可以生成对采用三个参数的新方法的调用。可选方法只是语法糖,当您不提供可选参数时,编译器会为您传递默认值。但是,如果您不重新编译代码就不会发生这种情况,并且您将尝试使用两个参数调用方法,而预期是三个参数。
我正在阅读有关版本控制更改时可选参数如何中断的 article。
在这里转述一下。
让我们看一下这两个概念在工作中的快速示例。认为 我们有一个 class,其中一种方法具有以下签名。
// 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/");
注意参数是否可选,你可以选择 是否按名称引用参数。在最后一种情况下,请注意 参数是乱序指定的。在这种情况下,使用命名 参数是必需的。
下一个版本
使用可选参数的一个明显好处是您可以 减少 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)'....
我很困惑为什么这个更改会破坏部署而不是重新编译的更改。
更改包含可选参数的方法签名后它应该仍然有效,不是吗?即使我们不重新编译客户端应用程序,因为这是一个可选参数。
您的代码需要重新编译,以便编译器可以生成对采用三个参数的新方法的调用。可选方法只是语法糖,当您不提供可选参数时,编译器会为您传递默认值。但是,如果您不重新编译代码就不会发生这种情况,并且您将尝试使用两个参数调用方法,而预期是三个参数。