定数を配列の様な添字付きで使いたい

解決


ぴろ  2013-02-14 07:54:32  No: 148079

皆様  いつもお世話になっております。  

定数を配列の様な添字付きで使いたい時は、どのように
してますでしょうか?

例えばコンボボックスに  High,Mid,Low  3個のアイテムがあり、
High(SelectedIndex=0)を選択しました。

Highの時は、変数SpeedValに123を入力したいとします。
(123は実際の制御速度などで定数です。)

(1)以前は
  TEISU(0)=123
  TEISU(1)=456
  TEISU(2)=789
のグローバル変数を作り、代入するSubで
  SpeedVal=TEISU(Index)  
の様な事をしていました。

(2)VB.NETになってからは

Private  Function ChangeSpeed(Index As Integer) As xxx

  Select Case Index
    123 456 789 を場合分け

  return(変換値)

End Sub

代入するSubで  SpeedVal=ChangeSpeed(Index)

の様にFunctionを使ってIndexに対応する値を返しています。

(3)ReadOnly配列も有りますが配列の個別要素は書き換え可能な様です。

(1)は、昔のBasicの様で良くない?
(2)は、2度手間?
(3)は、書き換え可能だけれどもReadOnlyが明示されて
いるので、後々わかりやすい?

(1)->(3)どれも、スマートな書き方では無い気がします。
どの様にするのがVB.netの作法なのでしょうか?

よろしくお願いします


魔界の仮面弁士  2013-02-14 14:38:47  No: 148080

> 定数を配列の様な添字付きで使いたい時は、どのように
> してますでしょうか?
定数の内容にもよりますが、VB6 のときは、
  ・LoadResString 関数で代用
  ・GetSetting 関数で代用
  ・Collection オブジェクトで管理
  ・Dictionarty オブジェクトで管理
  ・Public Get Property プロシージャで代用
などの手法を用いていました。

VB.NET でも同様に、
  ・リソースで管理
  ・List ジェネリックコレクションで管理
  ・Dictionary ジェネリックコレクションで管理
  ・Property 等で代用
  ・ReadOnly フィールドで代用
などで良いのではないでしょうか。

> (3)ReadOnly配列も有りますが配列の個別要素は書き換え可能な様です。
これって、配列の AsReadOnly メソッドのことでしょうか。
ReadOnlyCollection のインデクサに setter は無いはず…。

> SpeedVal=ChangeSpeed(Index)
私なら、配列または List(Of foo) の AsReadOnly を使うかな。


shu  2013-02-14 19:34:26  No: 148081

あまりその様に使用したことがないのですが
Privateで配列を作成して
Public ReadOnly Propertyで公開するのはどうでしょう?

要素の検索をするのであればこれだけでは駄目ですが。


ぴろ  2013-02-15 07:35:52  No: 148082

魔界の仮面弁士 様  Shu様
ご回答ありがとうございます。

>これって、配列の AsReadOnly メソッドのことでしょうか。
以下  MSDNより抜粋です。

MSDN ReadOnly(Visualbasic)より

この変数のデータ型が配列やクラス インスタンスなどの参照型の場合、
変数自体が ReadOnly であっても、このメンバーは変更できます。 
次に例を示します。 
 
ReadOnly characterArray() As Char = {"x"c, "y"c, "z"c} 

Sub changeArrayElement() 
    characterArray(1) = "M"c 
End Sub 

変数 characterArray は ReadOnly なので、一度初期化するとこの値は
変更できません。つまり、新しい配列をこれに代入することはできません。 しかし、配列のメンバー (1 つまたは複数) の値は変更できます。
プロシージャ changeArrayElement の呼び出し後、characterArray() が
参照する配列には "x"、"M"、"z" が格納されています。 

実際に書いてみましたが配列の中身は書き換え可能でした。

>私なら、配列または List(Of foo) の AsReadOnly を使うかな。

キーワードを頼りに検索したところお二人がDOBONさんの板で
解答されているのが見つかりました。内容はほぼ同じですがこんな感じで
しょうか?

■List(Of foo) の AsReadOnlyを使う方法

Imports System.Collections.ObjectModel

Public Class Form1

    Private ReadOnly DEFAULTb As ReadOnlyCollection(Of String) = _
       New List(Of String)(New String() {"0", "1", "2", "3", "4"}).AsReadOnly()

    Private ReadOnly ReadInteger As ReadOnlyCollection(Of Integer) = _
       New List(Of Integer)(New Integer() {10, 11, 12, 13, 14}).AsReadOnly()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e 
        As System.EventArgs) Handles Button1.Click

        Dim sz As String
        Dim st As Integer

        sz = DEFAULTb(2)
        st = ReadInteger(1)

        Debug.WriteLine("sz= " + sz)
        Debug.WriteLine("st= " + st.ToString)
    End Sub

End Class

私的にも、この書き方が後々わかりやすい感じがします。

余談ですが
会社の製造/検査プログラム(クラシックなCですが)の中にはyamada1,yamada2 なんていう
意味不明な変数・関数やlennon()という関数があったので調べてみると
beep音?でジョンレノンの曲が出るようになっていたりと自己流&遊び心
満載!!  解読が困難なプログラムが・・・。
以前は動けばOKみたいな感じでコードを書いていましたが、やっぱり後輩に
笑われない程度のコードは残したいと思っている今日この頃です。

皆様ありがとうございました。


魔界の仮面弁士  2013-02-16 01:11:31  No: 148083

>>> ReadOnly配列も有りますが
>> これって、配列の AsReadOnly メソッドのことでしょうか。
> MSDN ReadOnly(Visualbasic)より

これは、ReadOnly の配列ではなく、
ReadOnly なフィールドのことですね。

ぴろさんが最後に書かれた
> New List(Of String)(New String() {"0", "1", "2", "3", "4"}).AsReadOnly()
は「Array.AsReadOnly(New String() {"0", "1", "2", "3", "4"})」と書けますし、
> New List(Of Integer)(New Integer() {10, 11, 12, 13, 14}).AsReadOnly()
は「Array.AsReadOnly(New Integer() {10, 11, 12, 13, 14})」と書けます。

Array.AsReadOnly も、List(Of T).AsReadOnly も、両方ともに
ReadOnlyCollection(Of T) を返します。これは厳密には
配列ではありませんが、配列のように扱えます。

> 解読が困難なプログラムが・・・。
「Const ZERO As Integer = 1」とか…。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加