gpt4 book ai didi

c# - 通用扩展方法中的代码契约与 if

转载 作者:行者123 更新时间:2023-11-30 17:53:30 26 4
gpt4 key购买 nike

在我当前的系统中,我决定构建一些通用的扩展方法,以便稍后在整个当前系统中重用。

因为我正在使用 Microsoft Code Contracts,所以我决定首先包含它们以验证 sourcerange

1)

public static class MyExtensions {
public static void RemoveRange<T>(this ObservableCollection<T> source, IEnumerable<T> range) where T : class {
Contract.Requires(source != null);
Contract.Requires(range != null);

foreach (var element in range) {
source.Remove(element);
}
}
}

另一种实现方式是经典方式:

2)

public static class MyExtensions {
public static void RemoveRange<T>(this ObservableCollection<T> source, IEnumerable<T> range) where T : class {
if (source == null) {
throw new ArgumentNullException("source");
}

foreach (var element in range) {
source.Remove(element);
}
}
}

直到这一刻,我才没有这样的需求来设计通用类,使其能够在另一个系统中重用

编辑(开始)(另一个系统我指的是具有不同架构的具体不同的系统。示例:当前系统如果用于金融部门,它使用代码契约(Contract)。但其他系统可以用于军事部门,不会使用用于验证的代码契约(Contract)。)编辑(结束)

我和我的同事讨论过在另一个系统中使用扩展方法的泛型类的可重用性如何?

I) 一个意见是保留代码契约(Contract),因为这是整个当前系统中的验证规则。 (如第一个示例)。

这种方式的优势是我在整个系统中保留了一种验证方式(仅通过代码契约)。 缺点是,如果不将契约(Contract)替换为经典的If/Throw Exception.

II) 另一种观点是设计具有扩展方法的通用类,使其在另一个系统中可重用,即使我们直到现在才具备这样的要求。该意见需要通过 IFthrow exception(如第二个示例)进行验证的经典实现。

这种方式的优点是经过测试的具有扩展方法的通用类无需更改即可重用。但缺点是接近另一种类型的验证。

欢迎就使用哪种方法提出任何建议/意见。

感谢关注!

最佳答案

您可以将代码契约添加到类库中,而无需为使用该类库的任何其他程序集引入对代码契约的依赖。

代码契约由重写者实现,重写者更改指定代码契约的代码。 .Net 4 或更高版本中已经内置了对代码契约支持的其余部分,因此其他代码可以愉快地引用使用代码契约的库,而无需采取任何特殊步骤。

因此,您可以在某些程序集中使用代码契约,而不必担心引用这些程序集的任何其他内容。

具体来说,这个说法是不正确的:

The disadvantage is that this Tested Generic Class with Extension methods will not be reusable in another systems (which possibly will not use Code Contracts for validation) without replacing Contracts with classic If/Throw Exception.

因为您可以在“其他系统”中重用它(如果“其他系统”是指“不使用代码契约的程序集”)。

关于c# - 通用扩展方法中的代码契约与 if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17314754/

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