|
■No48723 (初心者 さん) に返信 > dim name as New Collection Collection を使うよりも、StringCollection や List(Of String) の方が 扱いやすいと思いますよ。
編集不可能にしたいなら、ReadOnlyCollection(Of String) という手も。
> 現在は定数を宣言して、コレクションに追加して使っていますが、スマートなやり方はあるでしょうか? 配列やコレクションで管理するのがスマートな方法だと思いますが、 今の方法だと、どの点がスマートではないと思われているのでしょうか?
コレクション等も使いたくないのだとすれば、定数の代わりにリソースを使うのは如何でしょう。 TextBox1.Text = My.Resources.Name1 などと記述する代わりに、 TextBox1.Text = My.Resources.ResourceManager.GetString("Name" & CStr(i)) などと記述できます。この場合、スコープが広がってしまいますけれども。
もしも定数のスコープが Private に限定されるのであれば、 Private Const Name1 As String = "Aさん" Private Const Name2 As String = "Bさん" Private Const Name3 As String = "Cさん" Private Shared Function GetConstName(ByVal Index As Integer) As String Return Choose(Index, Name1, Name2, Name3).ToString() End Function のように、中継用のメソッド(あるいはプロパティ)を用意する手もあります。
ただしこの方法だと、定数の数が増えたときにメソッド側の修正も必要になるので、 修正漏れに注意する必要があります。
もしもメソッド側の修正作業すら不要にしたいなら、リフレクションを使うという選択肢もあります。
'Imports System.Reflection Private Function GetConstName(ByVal Index As Integer) As String Dim bf As BindingFlags = BindingFlags.Default bf = bf Or BindingFlags.NonPublic bf = bf Or BindingFlags.Public bf = bf Or BindingFlags.Static
Dim constName As String = "Name" & CStr(Index)
Dim T As Type = Me.GetType() Dim F As FieldInfo = T.GetField(constName, bf) If F IsNot Nothing Then Return F.GetValue(Me).ToString() End If Return Nothing End Function
# ……ちっともスマートになっていないという罠。
|