首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#条件使用和默认参数

C#条件使用和默认参数
EN

Stack Overflow用户
提问于 2019-10-02 16:04:31
回答 4查看 424关注 0票数 6

假设我们有一个基于文件、连接或其他资源的操作。

我们需要一个方法,它可以使用提供的资源运行,或者-如果没有提供-创建自己的:

代码语言:javascript
复制
string Foo(Resource parameter = null)
{
    if (parameter == null)
    {
        using (var res = new Resource)
        {
            res.Something();
               /*......*/
               /*......*/
               /*......*/
            return /*..........*/
        }
    }
    else 
    {
            parameter.Something();
               /*......*/
               /*......*/
               /*......*/
            return /*..........*/
    }
 }

}

它是有效的,但这对我来说真的很难看。这是一种以更紧凑和更“好”的方式编写它的方式吗?

我不能使用:

代码语言:javascript
复制
string Foo(Resource parameter = null)
{
    using (var res = parameter ?? new Resource())
    {
        res.Something();
           /*......*/
           /*......*/
           /*......*/
        return /*..........*/
    }
}

因为如果作为参数传递,它将处置我的原始资源。

PS。这个问题的正确标签是什么?#coding-style被标记为“请勿使用”。

EN

回答 4

Stack Overflow用户

发布于 2019-10-02 16:12:06

我会用两种不同的方法。其中一个将包含所有的逻辑-它将是清晰和易于维护的。

代码语言:javascript
复制
string Foo(Resource parameter)
{
     parameter.Something();
     /...../
     return /...../;
}

string Foo()
{
     using (var res = new Resource)
     {
         return Foo(res);
     }
}

如果您只想将注入参数用于测试目的,这种情况也很有用。查找无参数方法的用法将导致实际的实现,另一种方法将直接指向测试用例。

票数 4
EN

Stack Overflow用户

发布于 2019-10-02 16:08:47

我会去当地的功能:

代码语言:javascript
复制
string Foo(Resource parameter = null)
{
    if (parameter != null)
    {
        return DoSomething(parameter);
    }

    using (var resource = new Resource())
    {
        return DoSomething(resource);
    }

    string DoSomething(Resource res)
    {
        res.Something();
        /...../
        return /...../
    }
}

(在 C# 8 中,您可以将其设为static本地函数)。 如果parameter只能在未提供时为nul(即有人永远不会调用 Foo(null)),那么您可以使用良好的旧方法重载:

代码语言:js
复制
string Foo(Resource resource)
{
    resource.Something();
    /...../
    return /...../
}

string Foo()
{
    using (var res = new Resource())
    {
        return Foo(res);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-10-02 16:08:47

我会选择一个本地函数:

代码语言:javascript
复制
string Foo(Resource parameter = null)
{
    if (parameter != null)
    {
        return DoSomething(parameter);
    }

    using (var resource = new Resource())
    {
        return DoSomething(resource);
    }

    string DoSomething(Resource res)
    {
        res.Something();
        /...../
        return /...../
    }
}

(在C# 8中,您可以将其设置为static本地函数)。

如果parameter只能在未提供时为null (即有人永远不会调用Foo(null)),那么您可以使用好的旧方法重载:

代码语言:javascript
复制
string Foo(Resource resource)
{
    resource.Something();
    /...../
    return /...../
}

string Foo()
{
    using (var res = new Resource())
    {
        return Foo(res);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58197512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档