繰り返しから脱出するbreakと似た機能として、メソッドからの脱出となるreturnというステートメントがある。returnは、値を返すメソッドで戻り値となる値を指定する機能があるとともに、メソッドの中間で使うと、そこでメソッドの実行を打ち切って、呼び出し側に戻るという機能を持つ。List 9-6に、それを使用したサンプル・ソースを示す。
1: using System;
2:
3: namespace Sample006
4: {
5: class Class1
6: {
7: private static int sample()
8: {
9: for( int i=0; i<10; i++ )
10: {
11: if( i==7 )
12: {
13: return i;
14: }
15: Console.WriteLine(i);
16: }
17: return -1;
18: }
19: [STAThread]
20: static void Main(string[] args)
21: {
22: int x = sample();
23: Console.WriteLine("sample() was done");
24: Console.WriteLine( x );
25: }
26: }
27: }
このサンプル・ソースを実行した結果はFig.9-6のようになる。
このサンプル・ソースは、sampleメソッドで繰り返しを実行するようになっている。9行目のforで10回繰り返しを行い、15行目の「Console.WriteLine(i);」によって何回目を実行中か出力する。そして、指定回数の繰り返しが終了すると、sampleメソッドを終了し、23行目で「sample() was done」と出力して繰り返し処理が終わったことを示す。しかし、11〜14行目のコードが存在することによって動作が変わる。11行目の条件により、変数iが7に達すると、13行目のreturnステートメントが実行され、そこでメソッドの実行は終了する。そのため、変数iが8や9になることがないだけでなく、17行目のreturnステートメントが実行されることも決してない。
なお、returnを含むメソッドに戻り値がない場合は、returnの後に式は書かない。戻り値がない場合、returnを書かなければならないのは中途脱出を意図した場合だけで、メソッドの最後で終わるなら、特にreturnを書く必要もない。
C#では基本的にオーバーフローのチェックを行わないとすでに説明したが、あくまでそのまま何もせずに使えば、ということであって、明示的に指定すればオーバーフロー・チェックもできる。そのための手段の1つが、checked、uncheckedステートメントである。それを使用したサンプル・ソースをList 9-7に示す。
1: using System;
2:
3: namespace Sample007
4: {
5: class Class1
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: int i=1;
11: i = i + int.MaxValue;
12: Console.WriteLine(i);
13:
14: unchecked
15: {
16: int j=1;
17: j = j + int.MaxValue;
18: Console.WriteLine(j);
19: }
20:
21: checked
22: {
23: int k=1;
24: k = k + int.MaxValue;
25: Console.WriteLine(k);
26: }
27: }
28: }
29: }
このサンプル・ソースを実行した結果はFig.9-7のようになる。
checkedステートメントで指定されたステートメントの中で計算が行われるとき、オーバーフローは例外としてスローされる(例外については後の章で解説する)。uncheckedステートメントはcheckedの反対で、オーバーフローのチェックを行わない。
11、17、24行目ではオーバーフローが発生するようになっている。11行目では何も指定していないので、チェックは行われず変な値になってしまう。17行目はuncheckedステートメントの有効範囲内なので、もちろん、オーバーフローはチェックされない。24行目は、checkedステートメントの有効範囲内なので、オーバーフローがチェックされ、例外が発生する。Fig.9-7を見ると、例外がスローされていることが分かると思う。
Copyright© Digital Advantage Corp. All Rights Reserved.