为什么我们不需要在`using`范围之外返回一个值?

时间:2013-07-22 07:45:09

标签: c#

考虑以下代码:

public int DownloadSoundFile()
{
   using (var x= new X())
   {
       return x.Value;
   }
}

和这段代码:

public int DownloadSoundFile()
{
    if (x!=null)
    {
       return x.Value;
    }
}

第一个代码没有给我们任何编译时错误,但在第二个代码中我们得到了这个错误:

  

并非所有代码路径都返回值

这意味着我们应该返回if范围之外的值。

为什么我们必须返回if范围之外的值,但不需要返回using范围之外的值?

4 个答案:

答案 0 :(得分:20)

  

为什么我们应该从if范围返回值,但不需要返回   超出使用范围的价值?

因为if范围可能不会执行(如果条件不满足),而using范围的主体保证总是执行(它将返回结果或抛出异常,对编译器来说是可以接受的)。对于if范围,如果条件不满足且编译器拒绝该方法,则您的方法是未定义的。

因此,如果您所写的条件不满足,您应该决定返回什么值:

public int DownloadSoundFile()
{
    if (x != null)
    {
       return x.Value;
    }

    // at this stage you should return some default value
    return 0;
}

答案 1 :(得分:7)

  

所以我们应该从if范围中返回值。

没有。您应该从int method()返回一个值。它与if() vs using()无关。

public int DownloadSoundFile()
{
    if (x!=null)
    {
        return x.Value;
    }
    // and now?? no return value for the method
    // this is a 'code path that does not return a value'
}

答案 2 :(得分:0)

public int DownloadSoundFile()
{
    if (x!=null)
    {
        return x.Value;
    }
}

在此代码中,如果 x null,该怎么办!!!在这种情况下,函数将如何返回值。所以正确的代码就是。

public int DownloadSoundFile()
{
    if (x!=null)
    {
        return x.Value;
    }
    else
    {
        // your return statement;
    }
}

您也可以使用以下代码。

return x != null ? x.value : *something else*

使用不用于返回某些内容,主要用于使代码不会因异常而中断。主要是在using语句中创建数据库连接。因为这可以确保连接异常被抑制,并且一旦超出范围就关闭连接。通常在using语句中使用从IDisposable继承的对象,以便调用dispose()方法。

答案 3 :(得分:0)

using是以下代码的别名:

IDisposable x = null;
try
{
     x= new X();
     //inside the using
     return x.Value;
}
finally
{
     if(x != null)
        x.Dispose();
}

所以你可以注意到每个路径都返回一个值;事实上,只有一条路径(或者可能是一条路径)。