R.田中一郎さんの記事を読んで、僕もふと、コーディングのたびに気になる事を思い出しました。
何かと言うと、usingブロック内で得た値を戻り値で返す場合です。
例えば、
public string Foo()
{
using (Hoge hoge1 = new Hoge())
{
hoge1.Fuga = "ふがふが";
string piyoResult = hoge1.Piyo():
return piyoResult;
}
}
と書くか、
public string Foo()
{
string piyoResult;
using (Hoge hoge1 = new Hoge())
{
hoge1.Fuga = "ふがふが";
piyoResult = hoge1.Piyo():
}
return piyoResult;
}
と書くか。
前者はusingブロックの中でreturnして、後者はusingブロックを抜けた後でreturnしてます。
こういう時は、僕の場合前者、つまりusingブロックの中でreturnしてしまいます。
でも、hoge1オブジェクトの操作を終えた後、「他の処理」が少々入る場合は、
public string Foo()
{
using (Hoge hoge1 = new Hoge())
{
hoge1.Fuga = "ふがふが";
string piyoResult = hoge1.Piyo():
string fooResult = piyoResult.Replace('-', '_')
return fooResult;
}
}
と書くのではなく、
public string Foo()
{
string piyoResult;
using (Hoge hoge1 = new Hoge())
{
hoge1.Fuga = "ふがふが";
piyoResult = hoge1.Piyo():
}
string fooResult = piyoResult.Replace('-', '_')
return fooResult;
}
という風に書きます。
理由は、「他の処理」を行う前にusingブロックを抜けることができるのに、無駄にhoge1を延命させてしまうのは無意味だからです。
「他の処理」が複数行に渡る場合、hoge1オブジェクトが既に不要となっていることが一目ではわかりづらいし、「他の処理」が重い場合、それだけ解放処理 ( Dispose ) が遅くなります。
こっちのパターンはこれでいいです。そんな気がします。
でも、最初のパターン、つまり「他の処理」が入らないパターンも、統一してusingブロックの前でreturnするべきな気がしてきます。
いやまてよ・・・、そもそもreturnの位置は重要でなく、usingブロックの範囲が重要なのかな。「他の処理」が入らずreturnするだけなら、usingブロック内に含めても何ら問題ないもんなぁ。その方が可読性は良いし。hoge1オブジェクトを操作する処理が複数行ある場合なんて特にそうですしね。
うん、そんな気がしてきた!そうすると、returnの位置は臨機応変ってことになりますね。
・・・ってことで、結局今まで通りでいいのかな?w
トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/96-b24408f0