3

考虑这段代码:

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

这个代码:

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

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

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

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

为什么一定要返回作用域外的值,if却不需要返回作用域外的值using

4

4 回答 4

20

为什么我们应该在 if 范围之外返回值,但不需要在 using 范围之外返回值?

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

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

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

    // at this stage you should return some default value
    return 0;
}
于 2013-07-22T07:46:44.470 回答
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'
}
于 2013-07-22T07:46:55.633 回答
0
public int DownloadSoundFile()
{
    if (x!=null)
    {
        return x.Value;
    }
}

在这段代码中,如果xnull!!! 在这种情况下,函数将如何返回值。所以正确的代码是。

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

您也可以使用以下代码。

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

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

于 2013-07-22T07:49:40.670 回答
0

using是以下代码的别名:

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

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

于 2013-07-22T08:09:24.850 回答