趣味でも仕事でもプログラム作成をやっていますが、ちょっとした疑問が出てきました。
それは、tryの中でreturnした場合、finallyは呼び出されるのか?
手続き型でのプログラミングが長かったので、私としてはreturnしたら即座にメソッドを抜けるものだと思ってました。
そうです。try(またはcatch)の中でreturnしてもfinallyは呼び出されるのです!
試しに、C#で以下のようなコードを書いてみました。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { Console.WriteLine("try"); // 最初に出力される return; } catch { Console.WriteLine("catch"); // 出力されない } finally { Console.WriteLine("finally"); // tryの次に出力される } Console.WriteLine("general"); // 既にreturnしているため、出力されない } } }
このコードをビルドして実行してみると、
try
finally
と表示されます。
手続き型での考え方で言えば、前述の通りでreturnしているわけですから、
try
と返ってくることが期待されますが、違います。
tryでもcatchでもreturnした際にはメソッドを抜ける前に必ずfinallyが呼び出されるのです!
これはC#だけではなく、javaなどのtry-catch-finallyが使える言語なら当然のことのようです。
正直、今知れてよかったと思っています。
手続き型ではreturn前に終了処理を必ず書くかgotoなどでメソッド末尾の終了処理に飛ぶ作りにする必要がありますが、これなら終了処理をfinallyに集約することができます。
集約することができるということは、コードを書く量が減りますし、メンテナンスも1か所の修正だけで済みます。
これでコードの流れに集中してコーディングができますね♪
まだまだ学ぶことはたくさんあるなぁと思った一日でした。
コメント