2016-09-09 6 views
3

チェックされたブロックは、オーバーフローが発生した場合に例外がスローされることを確認するために使用されます。たとえば、チェックされたブロックで呼び出されたメソッドでオーバーフロー例外が発生しない

以下のコードは、オーバーフロー例外をスローします。

checked 
{ 
    int a = 123456; 
    int b = 123456; 
    Console.WriteLine(a * b); 
} 

しかし、私がチェックブロック内でメソッドを呼び出し、ひいては方法は、オーバーフロー例外をスローして、コードを持っている場合は、確認ブロックはそれを検出していないようです。これらも同様に検出できますか?

checked 
{ 
    int a = 123456; 
    int b = 123456; 
    Console.WriteLine(Mul(a, b)); 
} 

public int Mul(int a, int b) 
{ 
    return a * b; 
} 

答えて

2

このブログ記事は、このトピックに関するいくつか説明します:

要するに

https://blogs.msdn.microsoft.com/oldnewthing/20140815-00/?p=233

:文がオンまたはオフモードで実行されているかどうか、実行時にコンパイル時に検出されていません。プログラムフローが関数メソッド呼び出しを含むチェックブロックから離れる場合、チェック/チェックされていない状態は関数自体に固有です。

Mul方法をチェックし、未チェックコードから呼び出すことができ - このように:

checked 
{ 
    int a = 123456; 
    int b = 123456; 
    Console.WriteLine(Mul(a, b)); 
} 
unchecked 
{ 
    int a = 123456; 
    int b = 123456; 
    Console.WriteLine(Mul(a, b)); 
} 

はどのように例外動作を実装する必要がありますか?例外を投げるかしないか?

したがって、Mulメソッドで具体的にチェックしてブロックを作成する必要があります。

public int Mul(int a, int b) 
{ 
    checked { 
     return a * b; 
    } 
} 
関連する問題