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