在c#中抛出异常,守卫

Cas*_*sen 5 c# exception

我今天讨论了重构这个问题(#1)

public void MyFunc(object myArgument)
{
    if(myArgument == null)
        throw new ArgumentNullException("myArgument");
....
Run Code Online (Sandbox Code Playgroud)

有了这个(#2)

//inside a shared assembly in a class called Guard
public static void AgainstArgumentNull(object obj, string message)
{
    if (obj == null)
        throw new ArgumentNullException(message);
}

public void MyFunc(object myArgument)
{
    Guard.AgainstArgumentNull(myArgument, "myArgument");
....
Run Code Online (Sandbox Code Playgroud)

我的直觉是#1更好,原因如下:

  1. #1比#2更简单,因为它不需要熟悉Util库,只需要基本的c#知识
  2. #1不会删除resharper重命名传递给ArgumentNullException构造函数的字符串的能力.
  3. #2将增加代码的依赖关系(必须能够访问包含dll的dll)
  4. #2的堆栈跟踪与#1的堆栈跟踪不同

我的问题是:我的直觉是否正确?在某些情况下,我们从另一个程序集中抛出异常的事实可能不会成为问题吗?

jas*_*son 1

对于这种特殊情况,您无论如何都不应该使用Guard。您应该使用代码合同。

Contract.Requires(myArgument != null);
Run Code Online (Sandbox Code Playgroud)