C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: VB.netの定数取得について


(過去ログ 82 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■48721 / inTopicNo.1)  VB.netの定数取得について
  
□投稿者/ 初心者 (116回)-(2010/04/13(Tue) 11:08:02)

分類:[VB.NET/VB2005 以降] 

同じくくりの定数が複数あるのですが、定数名の後ろに数字を付けてそのまま使いたいのですが、
そういった使い方はできるのでしょうか?

例)
Private Const Name1 as String ="Aさん"

Private Const Name2 as String ="Bさん"

Private Const Name3 as String ="Cさん"
と宣言し、
textBox1.text=Name & "1"
のような使い方です。
初心者なのでよろしくお願いいたします。
引用返信 編集キー/
■48722 / inTopicNo.2)  Re[1]: VB.netの定数取得について
□投稿者/ .SHO (1279回)-(2010/04/13(Tue) 11:23:24)
No48721 (初心者 さん) に返信

配列ではダメですか?

引用返信 編集キー/
■48723 / inTopicNo.3)  Re[2]: VB.netの定数取得について
□投稿者/ 初心者 (118回)-(2010/04/13(Tue) 11:43:42)
No48722 (.SHO さん) に返信
> ■No48721 (初心者 さん) に返信
>
> 配列ではダメですか?
>

現在は定数を宣言して、コレクションに追加して使っていますが、スマートなやり方はあるでしょうか?

Private Const Name1 as String ="Aさん"
Private Const Name2 as String ="Bさん"
Private Const Name3 as String ="Cさん"

dim name as New Collection
name.add(name1)
name.add(name2)
name.add(name3)

textbox1.text=name.item(1)
引用返信 編集キー/
■48724 / inTopicNo.4)  Re[3]: VB.netの定数取得について
□投稿者/ .SHO (1280回)-(2010/04/13(Tue) 11:58:55)
No48723 (初心者 さん) に返信

VBよくわからんけど、こんな感じで出来ないの?

Dim Name() as String = { "Aさん", "Bさん", "Cさん" }

引用返信 編集キー/
■48725 / inTopicNo.5)  Re[3]: VB.netの定数取得について
□投稿者/ 魔界の仮面弁士 (1613回)-(2010/04/13(Tue) 12:50:28)
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

# ……ちっともスマートになっていないという罠。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -