考虑以下代码:
public int DownloadSoundFile()
{
using (var x= new X())
{
return x.Value;
}
}
和这段代码:
public int DownloadSoundFile()
{
if (x!=null)
{
return x.Value;
}
}
第一个代码没有给我们任何编译时错误,但在第二个代码中我们得到了这个错误:
并非所有代码路径都返回值
这意味着我们应该返回if
范围之外的值。
为什么我们必须返回if
范围之外的值,但不需要返回using
范围之外的值?
答案 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();
}
所以你可以注意到每个路径都返回一个值;事实上,只有一条路径(或者可能是一条路径)。