gpt4 book ai didi

c# - 如何在 C# 中包装带有可选参数的方法?

转载 作者:行者123 更新时间:2023-11-30 20:52:41 25 4
gpt4 key购买 nike

我有以下 C# 类(此处已简化):

internal static class Assertions {
public static void Assert(bool condition, string message = "Assertion failed") {
if (!condition) { throw new System.Exception(message); }
}

public static void NotNull(object o, string message = "Assertion failed") {
Assert(!Object.ReferenceEquals(o, null), message);
}

public static void EtCaetera(..., string message = "Assertion failed") {
Assert(..., message);
}
}

如您所见,我有一个带有可选参数 string message = "Assertion failed" 的方法 Assertions.Assert()

当我围绕该方法编写包装器时,我希望包装器有一个默认参数 string message,但我想避免重复默认值 ("Assertion failed") 因为这违反了 DRY 原则:如果我想将消息 "Assertion failed" 更改为 "I crashed",我将不得不在许多地方更改该默认值。

如何传递可选参数的“缺失”?我正在寻找类似的东西:

public static void NotNull(object o, string message = Type.Missing) {
Assert(!Object.ReferenceEquals(o, null), message);
}

另一种选择是不使用可选参数并为每个方法提供两个版本,但这很快就会变得很麻烦。

最佳答案

可选参数在编译时解析,它们不会替换为特殊值,因此您在这里没有太多选择。

我的建议是引入一个特殊值(模仿 Type.Missing 是什么):

internal static class Assertions {
public static void Assert(bool condition, string message = null) {
if (!condition) {
throw new System.Exception(message ?? "Assertion failed");
}
}
}

internal static class Wrapper {
public static void Assert(bool condition, string message = null) {
Assertions.Assert(condition, message);
}
}

这还有另一个(IMO 很大的)优势:如果您更改错误消息(或者您将本地化),您将不必更改所有代码(现有的编译库将更新)。不要忘记,在您的原始代码中,这样的调用:

Assertions.Assert(value > 0);

将被翻译(和编译,即使您使用 const 字段)到:

Assertions.Assert(value > 0, "Assertion failed");

因此,即使您更改默认消息,编译的程序集也不会更新。

关于c# - 如何在 C# 中包装带有可选参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20701143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com