カテゴリー
C

独習C#第3版、P374 例外を投げる、取り敢えずやって見ました

using System;

// FailSoftArrayにLengthプロパティを追加する
namespace Chapter01All
{
    class RangeOverException : ApplicationException
    {
        public RangeOverException() : base() { }
        public RangeOverException(string msg) : base(msg) { }
        public override string ToString()
        {
            return "\n" + Message;
        }
    }
    class RangeUnderException : ApplicationException
    {
        public RangeUnderException() : base() { }
        public RangeUnderException(string msg) : base(msg) { }
        public override string ToString()
        {
            return "\n" + Message;
        }
    }
    class FailSoftArray
    {
        int[] a; // 配列への参照
        int len; // 配列の長さ

        public static bool ErrFlag; // 直前の操作の結果を表すフラグ

        // サイズを指定して配列を作る
        public FailSoftArray(int size)
        {
            a = new int[size];
            len = size;
        }

        // 読み取り専用プロパティLength
        public int Length
        { //←Lengthを、フィールドからプロパティに変更する
            get
            {
                return len;
            }
        }

        // FailSoftArrayオブジェクトのためのインデクサ
        public int this[int index]
        {
            // getアクセサ
            get
            {
                if (ok(index))
                {
                    ErrFlag = false;
                    return a[index];
                }
                else
                {
                    ErrFlag = true;
                    return -1;
                }
            }

            // setアクセサ
            set
            {
                if (ok(index))
                {
                    a[index] = value;
                    ErrFlag = false;
                }
                else ErrFlag = true;
            }
        }

        // インデックスが配列の上限・下限の範囲内ならtrueを返す
        private bool ok(int index)
        {
            if (index >= 0 & index < Length) return true;
            if (index < 0) throw new RangeUnderException("range under");
            throw new RangeOverException("range over");
            //return false;
        }
    }

    // 改良されたフェイルソフト配列
    class ImprovedFSDemo
    {
        static void Main()
        {
            FailSoftArray fs = new FailSoftArray(5);
            int x;

            // Lengthを読み取ることができる
            for (int i = 0; i < (fs.Length); i++)
                fs[i] = i * 10;

            for (int i = 0; i < (fs.Length); i++)   //i<=(fs.Length)として見るとエラーを捉えますが...
            {                                       // int i= -1;でもエラーを捉えますが...
                x = fs[i];
                if (x != -1) Console.Write(x + " ");
            }
            Console.WriteLine();

            //fs.Length = 10; // 不正、コンパイルエラー!
        }
    }
}

 throwで例外を捕えましたが、行きっぱなしでした。自分でとらえたほかに、システムでも捉えました。自分でとらえた時はエラーで終了では、上手くないですね。またやって見る必要ありそうです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

inserted by FC2 system