2011-07-25 34 views
4

我今天的讨论关于重构这个(#1)在C#中抛出异常,警卫

public void MyFunc(object myArgument) 
{ 
    if(myArgument == null) 
     throw new ArgumentNullException("myArgument"); 
.... 

有了这个(#2)

​​

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

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

我这里的问题是: 我的直觉是否正确? 事实上,我们从另一个程序集抛出异常不会在某些情况下变成麻烦?

回答

2

对于这种特殊情况,您不应该使用Guard。你应该使用代码合同。

Contract.Requires(myArgument != null); 
+0

请问这是否真的和上面的发布版本一样运行? –

+0

@Casper Leon Nielsen:你可以这样做,是的。 – jason

2

您可以从排名第2的标准化异常处理在一定程度上跨多个项目也受益;抽象还使库在后一时间得到增强并且例如重新分配。例如错误记录。