哪种方式更好:从语句中的方法返回值using
或之前声明变量,在内部设置并在之后返回?
public int Foo()
{
using(..)
{
return bar;
}
}
或者
public int Foo()
{
var b = null;
using(..)
{
b = bar;
}
return b;
}
哪种方式更好:从语句中的方法返回值using
或之前声明变量,在内部设置并在之后返回?
public int Foo()
{
using(..)
{
return bar;
}
}
或者
public int Foo()
{
var b = null;
using(..)
{
b = bar;
}
return b;
}
我更喜欢第一个例子。更少的变量,更少的代码行,更容易理解,更容易维护......
public int Foo()
{
using(..)
{
return bar;
}
}
遵循“少即是多”的原则(实际上只是KISS的一种变体),前者。需要维护的代码行数更少,语义没有变化,可读性也没有损失(可以说这种风格更容易阅读)。
using 语句可确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。您可以通过将对象放在 try 块中,然后 在 finally 块中调用 Dispose 来获得相同的结果;事实上,这就是编译器翻译 using 语句的方式。
finally 用于保证语句块的执行 ,而不管前面的 try 块如何退出。
要回答您的问题,是的,可以从 using 语句中返回。
第二种显然更好,您可以通过编写测试程序来验证它是否正常工作。
using
语句本身不能有值,这是一个限制。假设您有一个名为的方法Open
返回一个 open FileStream
,并且您想要获取文件的长度:
Console.WriteLine(Open().Length);
那里的错误是您没有处理FileStream
. 所以你必须写(类似于你的例子):
long length;
using (FileStream file = Open())
length = file.Length;
Console.WriteLine(length);
但是使用一个简单的扩展方法,你可以这样写:
Console.WriteLine(Open().Use(file => file.Length));
漂亮整洁,并且FileStream
得到妥善处理。
没有理由不这样做,因为该using
语句转换为try...finally
块并且finally
保证执行该部分(即使通过返回或未处理的异常)。
这真的取决于个人喜好。你会在这个特定围栏的两边找到争论。我自己,我赞成选项 1:尽快返回。我相信它更好地表达了代码的意图;没有理由比你必须坚持的时间更长。如果您已完成所有工作,请返回。
有时,您将有多个可能的返回点,并且“方法结束”工作(记录、清理)可能会将您引导至单个返回语句。这没什么可怕的,但是您通常可以在finally
块中或在面向方面的编程中使用方面来处理这些情况。
我觉得第二个更好
public int Foo()
{
using(..)
{
return bar;
}
}
使用这种方式时要记住的一件事是,我们在 using 之间返回,所以对象(我们已经包装在 using 中)将被处置,答案是肯定的,因为 using 语句只是 try/ finally 块,也可以从 try 块中返回。返回表达式将被计算,然后 finally 块将被执行,然后该方法将返回。所以继续:)