【发布时间】:2013-12-22 10:46:42
【问题描述】:
我希望我的对象不变方法抛出一个特定的异常。是否有意义?在 C# 中可能吗?
例如,我有以下代码,包括具有不变方法的类 A 和异常类 E。目前 E 类不参与 A...
class A {
int x = 0, y = 1;
[ContractInvariantMethod]
private void YisGreaterThanX() {
Contract.Invariant(x < y);
}
}
class E : Exception {
}
我需要的是以下内容。像 Contract.Requires 一样,拥有 Contract.Invariant(或者可能是一个属性构造函数,它接受异常派生类)会很有用。
class A {
int x = 0, y = 1;
[ContractInvariantMethod]
private void YisGreaterThanX() {
Contract.Invariant<E>(x < y);
}
}
class E : Exception {
}
这是一个好主意吗?可能是我的逻辑错了?
【问题讨论】:
-
Contract.Requires可以抛出异常以指示调用者代码中的错误。如果Contract.Invariant抛出,那几乎总是表明您的代码中存在错误。你能详细说明你为什么要这样做吗? -
@hvd,感谢您的回复。这是否意味着应该在每个
public A(int x, int y)类型的构造函数和每个类似的方法中包含Contract.Requires<E>(x < y)?还是说A类的逻辑被破坏了?.. -
是的,在那种情况下,我肯定会把它放在构造函数中。它是无效参数的组合,最好由
ArgumentException指示,而不是随后变得不可用的类的实例。 -
将其作为构造函数的要求也有助于文档:调用构造函数的代码知道
x < y是该构造函数的要求。 (出于某种原因,即使过去不到五分钟,SO 也不允许我编辑我之前的评论以包含此内容。) -
非常有帮助的 cmets。但是您的建议需要重复代码(在所有类似方法中都类似
Contract.Requires),不是吗?我应该写像Contract.Requires<ArgumentException>(Requirement(x, y));这样的东西,其中Requirement是在类A 中定义的,比如public Func<int, int, bool> Requirement { get { return (x, y) => x < y; } }?
标签: c# exception code-contracts throw invariants