C#-在方法中的输入参数验证之后立即抛出异常是否还有其他好处

C#-在方法中的输入参数验证之后立即抛出异常是否还有其他好处,c#,validation,exception,methods,arguments,C#,Validation,Exception,Methods,Arguments,我知道下面的GetInfo1方法提供了更好的可读性。但是,以下两种方法(即在方法开始时立即抛出异常)与方法结束时抛出异常)之间是否存在任何其他差异(例如运行时执行) public string GetInfo1(string name) { if(string.IsNullOrWhiteSpace(name)) throw new ArgumentException(nameof(name)); var info = GetInfoByN

我知道下面的GetInfo1方法提供了更好的可读性。但是,以下两种方法(即在方法开始时立即抛出异常)与方法结束时抛出异常)之间是否存在任何其他差异(例如运行时执行)

public string GetInfo1(string name) {
        if(string.IsNullOrWhiteSpace(name))
            throw new ArgumentException(nameof(name));

        var info = GetInfoByName(name);
        return info;
    }

public string GetInfo2(string name) {
        if(!string.IsNullOrWhiteSpace(name)) {
            var info = GetInfoByName(name);
            return info;
        }
        throw new ArgumentException(nameof(name));
    }

一开始就抛出意味着您在对所有信息进行任何操作之前都要对其进行验证。这也意味着代码不需要运行不需要的代码

如果您一开始就检查所有内容,那么它也可能比使用大量的
if
语句检查值更整洁(当您最终可能嵌套大量if时,这尤其有效)

同样值得注意的是,像Resharper这样的东西建议您尽快退出某个方法。因此,就建议的最佳实践而言,
GetInfo1
是推荐的方法

因此,简言之,一开始退出会更好,因为:

  • 更具可读性
  • 它遵循建议的最佳做法
  • 在整个方法中避免了大量不必要的if语句
  • 不需要运行的代码不会运行

  • 我认为GetInfo1方法更灵活,并提供更好的可扩展性。您可以添加代码(更多if语句)来验证更多案例,而无需删除任何内容

    我指的是一般情况。如果您只想检查null或空格,并且确定将来不会验证更多的情况,那么这两种方法都可以


    此外,请记住,例外情况应在例外情况下使用。用户忘记填写字段或错误输入空白是很常见的。

    注意,为非空参数抛出
    ArgumentNullException
    是非常糟糕的形式。如果我调用
    GetInfo1(“”
    ,我可能期望
    ArgumentException
    ,但不是
    ArgumentNullException
    。Agree@JonSkeet,但添加伪代码只是出于好奇,想找出差异。我会更新的。谢谢,我相信当您提前退出时,对代码进行推理会更容易。@Callumlington我在我的帖子中没有提到这一点,因为他已经说过,他知道代码更可读,但为了清晰起见,我添加了它。@webnoob我想if块中的代码即使在GetInfo2的情况下也不会运行,因为if条件的计算结果将为false,但是只是throw语句位于n个语句之后。@SivaramK您是正确的,但这是一个非常简单的例子。大多数示例都会更复杂,需要检查的数据也更多,在这种情况下很快就会变得混乱。