カテゴリー
C

独習C#第3版、P262 FailSoftArray インデクサ

// インデクサを追加して、フェイルソフトな配列を改良する
using System;
namespace Chapter07All
{
    class FailSoftArray
    {
        int[] a; // 配列への参照

        public static int Length; // 変数Lengthはpublic staticに変えてみました。

        public static bool ErrFlag; // 直前の操作の結果を表すフラグ 同じくstaticに変えてみました。

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

        // FailSoftArrayオブジェクトのためのインデクサ
        public int this[int index]
        { //←FailSoftArrayに対するインデクサ
          // 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;
            return false;
        }
    }

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

            // 失敗を表示しない
            Console.WriteLine("Fail quietly.");
            for (int i = 0; i < (FailSoftArray.Length * 2); i++) //クラス変数のアクセスはクラス名で修飾 
                fs[i] = i * 10; //←インデクサのsetアクセサが呼び出される

            for (int i = 0; i < (FailSoftArray.Length * 2); i++)
            {
                x = fs[i];    //←インデクサのgetアクセサが呼び出される
                if (x != -1) Console.Write(x + " ");
            }
            Console.WriteLine();

            // 今度はエラーを表示
            Console.WriteLine("\nFail with error reports.");
            for (int i = 0; i < (FailSoftArray.Length * 2); i++)
            {
                fs[i] = i * 10;
                if (FailSoftArray.ErrFlag)
                    Console.WriteLine("fs[" + i + "] out-of-bounds");
            }

            for (int i = 0; i < (FailSoftArray.Length * 2); i++)
            {
                x = fs[i];
                if (!FailSoftArray.ErrFlag) Console.Write(x + " ");
                else
                    Console.WriteLine("fs[" + i + "] out-of-bounds");
            }
        }
    }
}

 本の説明を見ると、LengthとErrFlagはメンバ変数で無くて、クラス変数の様だったので、staticにしてみました。正常そうには動きました。アクセス方法が違ってきます。インスタン変数であればfs.Lengthとなるのですが、クラス変数の場合はFailSoftArray.Lengthと変わります。

コメントを残す

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

inserted by FC2 system