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