宇宙仮面の C# プログラミング
   

Top

C# 2005

C# 2003

C# Windows Mobile

SQL Server 2005

SQL Server 2000

Virtual PC/Server

C# 研究室ブログ

C# ソフトウェア ダウンロード

C# 開発環境

宇宙仮面の C# プログラミングについて

.NET/C# eGroup JP

INETA Japan



Google
Web
uchukamen.com









cheched, uncheched キーワード

開発環境: Visual Studio 2003 

checked, uncheched 知っていますか?

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

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



デフォルトでは、次のように演算子のオーバフローおよびアンダーフローのチェックが 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);
                                        
                        }
                }
        }
}
このページを評価する

このページを評価する

悪い             良い
1 2 3 4 5
コメント(一言お願いします)