皆様 いつもお世話になっております。
定数を配列の様な添字付きで使いたい時は、どのように
してますでしょうか?
例えばコンボボックスに 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の作法なのでしょうか?
よろしくお願いします
> 定数を配列の様な添字付きで使いたい時は、どのように
> してますでしょうか?
定数の内容にもよりますが、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 を使うかな。
あまりその様に使用したことがないのですが
Privateで配列を作成して
Public ReadOnly Propertyで公開するのはどうでしょう?
要素の検索をするのであればこれだけでは駄目ですが。
魔界の仮面弁士 様 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みたいな感じでコードを書いていましたが、やっぱり後輩に
笑われない程度のコードは残したいと思っている今日この頃です。
皆様ありがとうございました。
>>> 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」とか…。
ツイート | ![]() |