宇宙仮面の
C# Programming

 

Imagecheched, uncheched キーワード

開発環境: Visual Studio 2003 

checked, uncheched 知っていますか?

C#では、オーバーフロー、アンダーフローの例外制御の、checked, unchecked があります。
これは、プログラムを組む際に割と見落としがちだと思うので、その扱いについて説明しておきます。

静的変数の場合のオーバフロー等の例外は、コンパイル時に検知されますが、
変数の時には、実行時オーバーフロー チェックはコンパイラオプションや環境設定などの外部要因によって決まります。
.Net Visual Studio では、次の場所ををチェックしてみてください。

Image

デフォルトでは、次のように演算子のオーバフローおよびアンダーフローのチェックが Falseになっていると思います。
これは、True にしておいたほうがいいでしょう。

このプロパティの出し方は、ソリューションエクスプローラーのネームスペースのプロパティ (この場合は、TestOperators) を右クリックしてプロパティを表示すればOK。

checked, unchecked のテスト

ヘルプでは、[un]checked( チェックすべきコード) のシンタックスしか記載がないが、

[un]checked {
    チェックすべきコード
} 

という形式でも通ることを確認した。
以下、checked, unchecked のテスト。

using System;

namespace TestOperators
{
        /// summary
        /// Class1 の概要の説明です。
        /// summary
        class Class1
        {
                static void Main(string[] args)
                {
                        // デフォルト
                        sbyte n1 = SByte.MaxValue;
                        try 
                        {
                                n1++;
                        }
                        catch (Exception e)
                        {
                                Console.WriteLine("Exception: {0}", e);
                        }
                        finally 
                        {
                                Console.WriteLine("Not specified: Exception has not been raised.");
                        }

                        // unchecked の場合
                        sbyte n2 = SByte.MaxValue;
                        try 
                        {
                                n2 = unchecked(n2++);
                        }
                        catch (Exception e)
                        {
                                Console.WriteLine("Exception: {0}", e);
                        }
                        finally 
                        {
                                Console.WriteLine("unchecked: Exception has not been raised.");
                        }

                        // checked() の場合
                        sbyte n3 = SByte.MaxValue;
                        try 
                        {
                                n3 = checked(n3++);
                        }
                        catch (Exception e)
                        {
                                Console.WriteLine("checked: Exception: {0}", e);
                        }

                        // checked{} の場合
                        sbyte n4 = SByte.MaxValue;
                        try 
                        {
                                checked
                                {
                                        n4++;
                                }
                        }
                        catch (Exception e)
                        {
                                Console.WriteLine("checked: Exception: {0}", e);
                                        
                        }
                }
        }
}
Image