加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#如何在一个班轮中“返回如果不为空”?

发布时间:2020-12-15 23:49:29 所属栏目:百科 来源:网络整理
导读:如果它不为空或继续执行,或者如何制作这样的东西,是否有一个衬垫返回一些东西? 这一切都是为了避免在几种方法中复制面食中的IF线. 初始代码是这样的: var error = ValidateStuff(someArg);if (error != null){ return error;}DoOtherStuff(); 那么如何重构
如果它不为空或继续执行,或者如何制作这样的东西,是否有一个衬垫返回一些东西?
这一切都是为了避免在几种方法中复制面食中的IF线.

初始代码是这样的:

var error = ValidateStuff(someArg);
if (error != null)
{
    return error;
}
DoOtherStuff();

那么如何重构它以避免复制粘贴,如果无处不在?
伪代码就像是

ValidateStuff(someArg) ? return ___ : continue;
DoSomethingElse();
AndMoreStuff();

-编辑-
一个更简单的例子,为了清除一些答案和评论中的疑虑:

public string Foo(string arg)
{
    string fuu = GetMeSomething(arg);

    if(fuu != null) return fuu;

    ImDoingThings();

    return "I did things";
}

拥有这个会很棒:

public string Foo(string arg)
{
    ReturnIfNotNull(GetMeSomething(arg));

    ImDoingThings();

    return "I did things.";
}

解决方法

当然:

void ValidateStuff(someArg) { 
    if (!validation(someArg)) { 
        throw new ValidationException("Whatever went wrong...",errorDetails);
    }
}

在你的代码中:

ValidateStuff(someArg);
DoOtherStuff();

P.S.:我经常将ValidateStuff中的通用代码与#if(DEBUG)[…] #else […] #endif结合起来,这样生产无关的东西不会最终出现在生产二进制文件中.

怎么警告?

我用了一些技巧:

>仅在您确实需要时才构建错误对象.
>同样,只有在出现故障时才构建错误列表.
>利用’使用’轻松编码.我是一个懒惰的程序员……虽然风险很小;如果你忘记使用,你就会遇到麻烦……不过,我认为这种风险比“让我们继续演出并忘记首先发出警告”的选择更好.
>如果你有一个更好的警告处理程序(所以:而不是异常),使用它并完成它.
>如果发生错误,请抛弃该批次.

显然你可以按照你认为合适的方式扩展它……

没有进一步到期:

public class WarningsHandler : IDisposable
{
    private List<WarningErrorBase> errors = null;

    // Default handler. Remember to use 'using',or otherwise you'll end up 
    // with pain and suffering!
    public void Dispose()
    {
        var errors = FetchValidationResults();

        if (errors != null && errors.Count > 0)
        {
            throw new ValidationException(errors);
        }
    }

    // Handler if you have a better idea than using an Exception
    public IEnumerable<Error> FetchValidationResults() 
    {
        var errors = this.errors;
        this.errors = null;
        return errors;
    }

    public void Warn(bool condition,Func<Warning> errorBuilder)
    {
        if (condition) 
        { 
            if (errors == null) { errors = new List<WarningErrorBase>(); }
            errors.Add(errorBuilder()); 
        }
    }

    public void Error(bool condition,Func<Error> errorBuilder)
    {
        if (condition) 
        { 
            if (errors == null) { errors = new List<WarningErrorBase>(); }
            errors.Add(errorBuilder()); 

            throw new ValidationException(FetchValidationResults());
        }
    }
}

如何使用它?

void MyThing()
{
    using (var handler = new WarningsHandler())
    {
        handler.Error(foo == null,"Foo must have a value");
        handler.Warn(foo.Count > 2,() => new Warning("You should have less than 2 foo's present.");
        // etc.
    }
}

好的,还有一个技巧.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读