- ベストアンサー
クラスの初期値設定について
早速ですが、教えてください(開発環境は WindowsXP,VisualBasic.NET2003 です) Public Class CCC Private Key As Integer Private Value As String End Class 上記のようなクラスを用意して Public Sub SSS() Dim III() As CCC = New CCC() {{1, "VALUE1"}, _ {2, "VALUE2"}} End Sub といった具合に初期値を設定したいのですが、 コンパイルエラー(配列初期化子の次元が多すぎます。)に なってしまいます。(ほかに思いついた記述パターンも試してみましたがだめでした) 仕方なく、CCCに下記のようなメソッドを作って Public Class CCC Private Key As Integer Private Value As String Public Sub SetValue(ByVal a As Integer, ByVal b As String) Key = a Value = b End Sub End Class このメソッドを利用し Public Sub SSS() Dim III() As CCC III(0).SetValue(1, "VALUE1") III(1).SetValue(2, "VALUE2") End Sub 上記のように初期値を設定するようにしています。 初期化子({})をつかって、C言語?風に初期値を設定することは できないのでしょうか? 上記の例では、顕著に現れてませんが、クラスの中のクラスにも 初期値を設定しようとする場合、どのような初期値が設定されて いるかが、ソース上、整然と並ばなくなってしまい、修正しにくい 、見た目が美しくない状態になってしまいます。 何かよい方法はないのでしょうか?ご教示願います。 (参考URLだけでもかまいません、よろしくお願いします)
- kidanorio
- お礼率62% (5/8)
- Visual Basic
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
'こんな感じ Imports System Module Module1 Public Class CCC Private Key As Integer Private Value As String Public Sub New (i As Integer, s As String) Key = i Value = s End Sub Overrides Public Function ToString() As String ToString=String.Format("CCC({0},{1})",Key, Value) End Function End Class Sub Main() Dim data() As CCC = new CCC(){ _ New CCC(1, "aaa"), New CCC(2, "bbb"), New CCC(3, "ccc")} for each c As CCC in data Console.WriteLine(c) next End Sub End Module
その他の回答 (1)
- todo36
- ベストアンサー率58% (728/1234)
# キーワードだけ。 コンストラクタ
お礼
コンストラクタで自分なりに挑戦してみたんですがどうもうまくいかなくって・・・わかってみると、どうやら、コンストラクタのつくりはあってたんですが、その使用方法が間違っていたみたいです。ありがとうございました<m(__)m>
関連するQ&A
- VBAでクラス設定
(標準モジュール) Option Explicit Sub test() Dim Class As Class1 Set Class = New Class1 Class.Obj = 1000 Set Class = Nothing Set Class = New Class1 Range("a1").Value = Class.Obj Set Class = Nothing End Sub (クラスモジュールClass1) Option Explicit Private a As Integer Public Property Get Obj() As Integer Obj = 2000 End Property Public Property Let Obj(ByVal NewNumber As Integer) a = NewNumber End Property 上のマクロではやり取り1変数になってますがこれを配列に変えたいのですがどうすればいいでしょうか?
- ベストアンサー
- Visual Basic
- 【vb.net】クラス化について
大学で以下のような練習問題を頂きました。 ----- Public Sub test() Dim a As b = New c Dim i As Integer = 1 a.disp(i) End Sub 問:この時のbとcを実装せよ。 ----- Public Class c Public Function disp(ByVal i As Integer) As String return "iは" & i & "です" End Function End Class までは書いてみたのですが、b の扱いがどうもわかりません。 どなたか教えていただけませんでしょうか。
- ベストアンサー
- Visual Basic
- VB.NETで値や参照について ByRefなど
VB.NETで値や参照について、まだ初学ですがよろしくお願いします。 VBは2008です。 以下のようなs文字列を参照引数にしたSetDataメソッドがあります。 ByRef s As Stringという引数は、SetData内でsを書き換えると、 呼び出したSetDataメソッド外でも中身が変わるので 私のByRefの認識ではポインタと解釈しています。間違っているでしょうか? SetData(1,1, buf)とすれば、DataGridViewの中は、「初期値」という文字が表示されます。 別のメソッド(KaKikae)でbufを"あ"という文字に変えた場合、SetDataメソッドを使わなくても 書き換わっていると思っていたのですが、実際実行してみると書き換わりません。 値や参照について理解が足りないからだと思いますがわかりません。 どのようにすれば、それが実現できるのでしょうか? Public Class HogeClass Private buf As String = "初期値" Private Sub SetData(ByVal x As Integer, ByVal y As Integer, ByRef s As String) As Boolean Dim dg As DataGridView dg = DataGridView1 dg.Item(x, y).value = s End Sub Private Sub KaKikae() buf = "あ" End Sub End Class
- 締切済み
- Visual Basic
- VB.net2008 設定画面の作成
VB.net2008 設定画面の作成 こんにちは、プログラミングの勉強を行っているのですが。 少し、躓いてしまったのでこちらで質問させてください。 Form1 と Form2 という二つのフォームを用意して。Form1で使用している設定値クラスをForm2にコピーして設定変更を行った後リターンで返すということを考えています。 ですが、どうしてもうまく書けないため、ご助言ください。 -----------------------以下ソース----------------- Public Class Form1 'XMLに設定保存 Private Sub SaveSetthing() Dim wset as New Setting 'XMLserializerで書き込み ~~~~~~~~~~~~~~~~~~~ End sub '設定読み込み Private Sub LordSetthing() 'XMLserializerで読み込み Dim lset as New Setthing ~~~~~~~~~~~~~~~~~~~ End sub EndClass Public Class Setthing Public UserName as String Public Age as Integer ~~~~~~~~~~~~~~~ Public Function Clone() as Setthing Return DirectCast(MyBase.MemberwiseClone,Setthing) End Function End Class ---------------------------------------------- このときに、Form1のボタンを押したらForm2を開く動作で ------------------------------------------------- Private sub ボタンクリック(Bybal*************) Dim f as Form2 = New Form2(Setthing.Clone) if f.ShowDialog = Windows.Forms.DialogResult.OK then me.Setthing = f.GetValue End if End sub ------------------------------------------------- ↑ここで返り値を受けたいと考えています。 ↓Form2構文 -------------------------------------------------- Public Class form2 Public sub New(ByVal Value as Setthing) InitializeComponent() Dim TempSetthing as Setthing = Value End sub 'ここで、渡された設定値の表示と設定画面で変更された設定の読み込み Public Function GetValue() As Setthing Return TempSetthing End function End Class -------------------------------------------------- と、大雑把に書き込みましたがこのような感じの処理を行いたいです。 ですが、私の理解が足りない為Form2内でTempSetthing内のデータの読み書きが行えません(宣言できません) 独学で作ったものですので、ここまでの流れがおかしなものになっている可能性もありますが。 「このような処理が行いたい!」というのは伝えれるかとは思います。 Form2内でTempSetthingの値を変更できるようなTextBox等を作成して。代入する形にしたいのですが。 ご教授お願いします・・・
- ベストアンサー
- Visual Basic
- VB6構造体をVB2008クラスで行う場合
何方かの質問「VB6構造体をVB2008クラスで行う場合」 の回答プログラムにて参考とさせて頂きましたが 申し訳ありません、初心者しにて・・・・・教えてください。 値を「登録、参照部分」のクラス(抜粋) Public Class Program Public Shared Sub Main() (省略) End Sub End Class 上記部分なのですが (1)Sharedを使用する訳はなんでしょうか?(省いても問題ありませんか?) (2)登録、参照部分のクラスPublic Shared Sub Main()を「登録のメソッド」と「参照のメソッド」に 分けたいのですがどうしてもうまくいきません。 何方か御教授願えないでしょうか? よろしくお願いします。 「以下何方かの質問の回答プログラム」 ■クラス+コレクションクラス Public Class Group Public MainID As Integer Public SubID As Integer Public Value1 As Integer Public Value2 As Integer End Class Public Class GroupCollection : Inherits System.Collections.Generic.Dictionary(Of Integer, Group) Public Shadows Sub Add(ByVal Item As Group) MyBase.Add(Item.SubID, Item) End Sub End Class Public Class Program Public Shared Sub Main() Dim DataDict As New GroupCollection Dim NewGroup As New Group NewGroup.MainID = 1 NewGroup.SubID = 101 NewGroup.Value1 = 123 NewGroup.Value2 = 234 DataDict.Add(NewGroup) Console.WriteLine(DataDict.Item(101).Value2) ' 出力 234 End Sub End Class
- ベストアンサー
- Visual Basic
- VB.NETのメモリ領域について
VB.NETのメモリ領域について 以下の(1)~(12)の変数のために、 スタック領域、静的領域、ヒープ領域のどこのメモリが使われるか教えてください。 Class Sample Dim a As Integer '(1) Dim b As String = "BBB" '(2) Shared c As Integer '(3) Shared d As String = "DDD" '(4) Sub X() Dim f As Integer '(5) Dim g As String = "GGG" '(6) Static h As Integer '(7) Static i As String = "III" '(8) End Sub Shared Sub Y() Dim k As Integer '(9) Dim l As String = "LLL" '(10) Static m As Integer '(11) Static n As String = "NNN" '(12) End Sub End Class それぞれこんな認識で合ってますか? スタック領域 (1)(5)(9) スタック領域にポインタ+ヒープ領域に実体 (2)(6)(10) 静的領域 (3)(7)(11) 静的領域にポインタ+ヒープ領域に実体 (4)(8)(12)
- ベストアンサー
- Visual Basic
- クラスに配列を渡す方法
こんにちは、VB.NET初心者です。 メインプログラムからクラスに配列を渡したいのですが、どうやって渡せばいいのかわかりません。 一応、いろいろなサイトやMSDNを覗いたのですが、よく分かりませんでした。 よろしければ、教えてください。環境はVB2005です。 下記のは現在書いているソースなのですが、この場合エラーがでます。 メインプログラム Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click Dim abc() as integer ’配列に何かを入れる処理を記述 ’何個の要素が入るかはわかりません。通るときによって変わります。 Dim 123 As New clsAAA 123.ABC = abc 123.処理1() End Sub clsAAA Private pABC() As Integer Public Property ABC() As Integer Get Return pABC End Get Set(ByVal value As Integer) pABC = value End Set End Property
- ベストアンサー
- Visual Basic
- ArrayListの初期値の設定の仕方(VB.NET)
VB.NET2005についての質問です。 ArrayList型の変数の初期値に、プロパティの戻り値を設定することは可能でしょうか。 (つまり、下記の(a)(b)の二行を一行にまとめたい、と考えています) どうぞよろしくお願い致します。 Public Class form1 Dim hoge As New ArrayList 'a)初期値としてClass1.P_hogeを設定したい hoge = Class1.P_hoge 'b)消したい End Class Public Class Class1 Private Shared _hoge As New ArrayList 'すでに値が格納されているものとする Public Shared Property P_hoge() As ArrayList Get Return _hoge End Get End Property End Class
- ベストアンサー
- Visual Basic
- 複数フォームへのイベントの通知方法について
Visual Basic2005にてプログラミングをしております。プログラミング初心者です。 以下、どなたかご教授いただけませんでしょうか? あるクラスを定義し、そのクラスの1つのインスタントがイベントを出した時に、 フォーム1~フォーム3の各Formにイベントを通知する様なプログラムを作成しております。 複数フォームへのイベントの通知方法として、以下の様なやり方は一般的に正しいのでしょうか? プログラムを実行させて見ると、動作上は何の問題もなく動いている様に見えますが、 プログラミング経験が少ない事もあり、以下のやり方が本当に正しいのかどうか、あまり自信が持てません。 どなたかご教授いただけると助かります。宜しくお願い致します。 =================================================================================== 'クラスA Public Class classA Public Event StatusChange(ByVal status As Integer) Public Event MassageOutput(ByVal message As String) Private status As Integer Private Sub EventReport1() status = 5 'statusの変更を通知するイベントを生成させる RaiseEvent StatusChange(status) End Sub Private Sub EventReport2() 'メッセージを通知するイベントを生成させる RaiseEvent MassageOutput("メッセージを通知します") End Sub End Class 'モジュール Module moduleA Public myInstance As New classA End Module 'フォーム1 Public Class form1 Private WithEvents myInstance1 As classA Public Sub New() InitializeComponent() myInstance1 = myInstance End Sub Private Sub StatusChange(ByVal message As String) _ Handles myInstance1.MassageOutput TextBox1.Text = message End Sub End Class 'フォーム2 Public Class form2 Private WithEvents myInstance1 As classA Public Sub New() InitializeComponent() myInstance1 = myInstance End Sub Private Sub StatusChange(ByVal status As Byte) _ Handles myInstance1.MassageOutput TextBox1.Text = status.ToString End Sub End Class 'フォーム3 Public Class form3 Private WithEvents myInstance1 As classA Public Sub New() InitializeComponent() myInstance1 = myInstance End Sub Private Sub StatusChange(ByVal status As Byte) _ Handles myInstance1.MassageOutput TextBox1.Text = (status + 10).ToString End Sub End Class ===================================================================================
- ベストアンサー
- Visual Basic
- VB.NETで出来てC#で出来ない???
VB.NETでは出来るのにC#で同じようにするやり方がわからなくて困っています。 VSのバージョンは2008です。 やりたいことは 『param.Item("AAA") = "111"』 このように書けるクラスを作りたいのですが、 VBで出来てC#では出来ないのでしょうか? イメージとしてはプロパティにメソッドをくっつけたようなクラス? C#ではこのように書くとエラーになります。 どのようにしたらいいでしょうか? public string Item(string Key) { set { _param[Key] = value; } } VB Dim param As New Param() param.Item("AAA") = "111" ----Paramクラス---- Imports System.Text Public Class Param Private _Hash As New Hashtable Default Public Property Item(ByVal Key As String) As String Get Return _Hash(Key) End Get Set(ByVal value As String) _Hash(Key) = value End Set End Property End Class ---------
- ベストアンサー
- その他(プログラミング・開発)
お礼
ありがとうございます!(^^)!まさに求めていたとおりです。 この方法でやれば、クラスが入れ子?になっていても問題ないですね。 No1さんからのヒントのとおり、コンストラクタでやる方法は試していたんですが Dim data() As CCC = new CCC(){ _ New CCC(1, "aaa"), New CCC(2, "bbb"), New CCC(3, "ccc")} この記述にたどりつけていませんでした。^^; 基本が、わかっていないですね・・・すみません でも、ほんとに助かりましたありがとうございます。