3

我的大多数方法都检查了函数中的空参数,所以我想而不是写

Debug.Assert(x != null, "x should not be null");

if (x == null)
{
    throw new ArgumentNullException("x");
}

在任何地方,我都会简单地创建一个带有静态方法的静态类来集中它。

但是,这有其自身的问题,即如果 Debug.Assert 被触发,那么 VS 将在静态方法中弹出,而不是在调用方法所在的位置,这是它喜欢的位置。

只是好奇是否有人有更好的方法来处理这种情况,或者只是一般来说如何处理这种重复的工作?

谢谢!

4

5 回答 5

2

另一种方法是Microsoft Research 的DataContracts

于 2011-11-11T07:51:18.640 回答
1

如果您要显式抛出异常,那么断言 x != null 几乎没有意义。您将在调试中看到异常,除非您有一些全局异常处理 - 即使这样您也可以中断所有异常,而不仅仅是未捕获。

如果您决定最安全的发布模式代码路径是做一些除了抛出异常之外的事情,例如提前从您的函数返回,将您的变量初始化为默认值等,那么使用 assert 的时间将是。

不要忽略其他答案中提到的实用程序,但您可能希望在给定的情况下仔细考虑抛出异常或断言是否合适(这不仅适用于参数验证)。

于 2011-11-11T07:58:36.060 回答
1

一种方法将除变量名称之外的所有内容都放入代码中,以尽量减少源代码中文字内容的数量:

Guard.Check(EGuards.NotNull, "x");

如果您喜欢流畅的扩展,另一种方法是(我喜欢这个)。

x.MustNotBeNull();
于 2011-11-11T08:02:36.527 回答
0

您可能还想查看此处描述的 Enterprise Library Exception Hadling Block 。它的特点之一是集中的异常处理。如果没有别的,它是开源的,所以你可以将它用作你自己实现的模式。

于 2011-11-11T13:19:01.430 回答
0

例如在Sharp-architecture中查看按合同设计

于 2011-11-11T08:30:26.710 回答