DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プロパティ内でのエラーチェック

分類:[.NET]

下記のようなプロパティを作成しています。
添字iが配列の要素数の範囲内に収まっているか
チェックするのをプロパティ内に記述する事ができますか?
呼び出す前に範囲チェックをすれば良いのですが
色々な場所でこのプロパティを使用しているため
出来れば1箇所でチェックできればと思っています。

private string[] _Name = new string[100];
public string[] Name
{
get
{return _Name;}
set
{_Name = value;}
}

label1.Text = Name[i]
■No7347に返信(ことぶきさんの記事)
> 下記のようなプロパティを作成しています。
> 添字iが配列の要素数の範囲内に収まっているか
> チェックするのをプロパティ内に記述する事ができますか?

今日は 平ちゃんです。
C# の記述方法が解らないので VB の場合ですが
最後の
label1.Text = Name[i]は VB では
label1.Text = Name(i) と記述できます。
この場合Name(i) はフアンクションです。
C# で label1.Text = Name[i] がファンクションとみなすことができれば
同様にできますので次のようにできます。

元のプロパティの名前を変更する。(仮にOname)
ファンクション Name を定義する。
Public Function Name(ByVal i As Integer) As String
Dim s() As String
s = oname
If i < 0 Or oname.GetUpperBound(0) < i Then
Return "配列インデックスが範囲外です"
End If
Return s(i)
End Function

このようにすると元の呼び出しの記述を変更することなく
label1.Text = Name(i)
でできます。

但しC#ではどうなのか不明です。
また label1.Text = Name(i)  の使い方に限定した場合です。
また プロパティではなくファンクションに変えているので 質問に合ってないかもしれません。

もっと良い方法は今のところ思いつきません。
別の方宜しくお願いします。
■No7352に返信(平ちゃんさんの記事)
> ■No7347に返信(ことぶきさんの記事)
>>下記のようなプロパティを作成しています。
>>添字iが配列の要素数の範囲内に収まっているか
>>チェックするのをプロパティ内に記述する事ができますか?
>
> 今日は 平ちゃんです。
> C# の記述方法が解らないので VB の場合ですが
> 最後の
> label1.Text = Name[i]は VB では
> label1.Text = Name(i) と記述できます。
> この場合Name(i) はフアンクションです。
> C# で label1.Text = Name[i] がファンクションとみなすことができれば
> 同様にできますので次のようにできます。
>
> 元のプロパティの名前を変更する。(仮にOname)
> ファンクション Name を定義する。
> Public Function Name(ByVal i As Integer) As String
> Dim s() As String
> s = oname
> If i < 0 Or oname.GetUpperBound(0) < i Then
> Return "配列インデックスが範囲外です"
> End If
> Return s(i)
> End Function
>
> このようにすると元の呼び出しの記述を変更することなく
> label1.Text = Name(i)
> でできます。
>
> 但しC#ではどうなのか不明です。
> また label1.Text = Name(i)  の使い方に限定した場合です。
> また プロパティではなくファンクションに変えているので 質問に合ってないかもしれません。
>
> もっと良い方法は今のところ思いつきません。
> 別の方宜しくお願いします。
>
>
平ちゃんさん。有難うございます。
早速C#に変換して試してみましたがエラーが発生します。
呼び出しもとのlabel1.Text = Name[i]の部分ですが
関数にした場合C#ではName(i)と記述しないとエラーになります。
教えて頂いた方法を参考に色々とやってみますので
引き続き宜しくお願い致します。
■No7354に返信(ことぶきさんの記事)

> 平ちゃんさん。有難うございます。
> 早速C#に変換して試してみましたがエラーが発生します。
> 呼び出しもとのlabel1.Text = Name[i]の部分ですが
> 関数にした場合C#ではName(i)と記述しないとエラーになります。
> 教えて頂いた方法を参考に色々とやってみますので
> 引き続き宜しくお願い致します。
>
そうですか
やはりエラーとなりますか。
問題は label1.Text = Name[i] の記述でiを引数としてプロパティや
関数に渡せないことです。
呼び出し元 label1.Text = Name[i]
やプロパティ部分を書き替えないと無理ということですかねぇ。
> 下記のようなプロパティを作成しています。
> 添字iが配列の要素数の範囲内に収まっているか
> チェックするのをプロパティ内に記述する事ができますか?
> 呼び出す前に範囲チェックをすれば良いのですが
> 色々な場所でこのプロパティを使用しているため
> 出来れば1箇所でチェックできればと思っています。

通常そのようなことがしたい時にはインデクサを使用するべきです。
しかし、インデクサはstaticとして宣言できないので、クラス名を
Nameなどとするわけにはいきません。ほかの名前でクラスを作って
そのインスタンス名をNameにすることになると思います。

そのエラーが頻発しないのであれば、
tyr/catchでIndexOutOfRangeExceptionを監視したほうがいいでしょう。
(例外のthrowは高コストになるから)
■No7361に返信(antさんの記事)
>>下記のようなプロパティを作成しています。
>>添字iが配列の要素数の範囲内に収まっているか
>>チェックするのをプロパティ内に記述する事ができますか?
>>呼び出す前に範囲チェックをすれば良いのですが
>>色々な場所でこのプロパティを使用しているため
>>出来れば1箇所でチェックできればと思っています。
>
> 通常そのようなことがしたい時にはインデクサを使用するべきです。
> しかし、インデクサはstaticとして宣言できないので、クラス名を
> Nameなどとするわけにはいきません。ほかの名前でクラスを作って
> そのインスタンス名をNameにすることになると思います。
>
> そのエラーが頻発しないのであれば、
> tyr/catchでIndexOutOfRangeExceptionを監視したほうがいいでしょう。
> (例外のthrowは高コストになるから)

antさん。何時も有難うございます。
今までインデクサについての解説等を読んでもピンとこなかったのですが
必要に迫られて一部理解できました。
インデクサに書き直そうと思ったのですが、今回の質問では分かりやすいように
プロパティを1個だけ使用して質問していましたが実際にはstring、int形式で
16個のプロパティを使用しています。全部書き直すのは良いのですが
解説等にはstring形式だけの説明があり、int形式は無理のようですね?
書き換えようと思っていて気が付いたのですが、プロパティの中で
エラーをキャッチできたとして、その結果により処理ルーチンを作るのも
事前に添え字の範囲をチェックするのもあまり代わりがないことに
気が付きました。色々とアドバイスを頂きましたが、今回は事前に添え字の
範囲をチェックして配列のプロパティを使用することの繰り返しを
だらだらと繰り返すことにします。(後でソースを見たときに自分には
これが一番分かりやすいので)
皆さん有難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板