- PR -

StringBuilder配列の初期化の仕方

投稿者投稿内容
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-12-12 10:29
 こんにちは。

1つ教えて下さい。
StringBuilderを配列で使用したいのです。

初期化したいのですがnewが使えません。

Dim sb(0 To 10) As StringBuilder
とした後、どのように初期化したらよいのでしょうか?

ご教授宜しくお願いします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-12-12 10:52
newは使えます。

コード:
Dim sb As StringBuilder()


sb = New StringBuilder(10) {}

For i As Integer = 0 To sb.Length - 1
sb(i) = New StringBuilder()
Next


sbはStringBuilderを要素とする配列型です。
その配列が要素とするStringBuilderのインスタンスは別にnewする必要がありますよね。

[ メッセージ編集済み 編集者: 一郎 編集日時 2007-12-12 10:54 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-12-12 11:01
配列を用いた場合は、初期化の考え方は、StringBuilder でも、他の型でも同様です。
値型でも参照型でも、初期化したい場合は、本来は全ての要素を初期化しなければなりません。

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-12 11:19
本来...?

この手の話題を見るといつも思うのですが、

引用:

Dim sb(0 To 10) As StringBuilder


CLR は型が主役なので個人的には Dim sb() As StringBuilder ではなくて、Dim sb As StringBuilder() として 「配列」 であることを意識させた方が良いなぁなんて思ってしまいます。(非常に傲慢な提案ですが)

もうひとつ思うのが 「デバッガ」 と 「式ウォッチ」 という強力な組み合わせを利用してデバッグしていないのではないかというところです。 提示されましたコードの System.Text.StringBuilder の配列を式ウォッチで見てみますと全要素 'Nothing' になっているハズです。 あとは System.NullReferenceException 云々がなぜ起きるのかさえ知っていれば自己解決できそうです。

(先を越されたので) ゴミでも貼っておきます。

コード:

    ' なびさん方式

    Dim sb(0 To 10) As System.Text.StringBuilder 

    For i As Integer = 0 To sb.Length - 1
        sb(i) = New System.Text.StringBuilder()
    Next

コード:

    ' 一般的? (そもそも配列ではなくて別のものを利用しそう)

    Dim sb As System.Text.StringBuilder() = New System.Text.StringBuilder() {}

    For i As Integer = 0 To sb.Length - 1
        sb(i) = New System.Text.StringBuilder()
    Next

コード:

    ' ちょww 方式

    Dim sb As System.Text.StringBuilder() = New System.Text.StringBuilder() { _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder(), _
        New System.Text.StringBuilder()  _
    }


配列ではなくて別のモノを利用することが多いと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-12-12 11:23
 返答ありがとうございます。

sb = New StringBuilder(0 To 11) {}
とした後

1つずつ
For i As Integer = 0 To sb.Length - 1
sb(i) = New StringBuilder()
Next
するのですね。

R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-12-12 11:30
引用:

なびさんの書き込み (2007-12-12 11:23) より:

sb = New StringBuilder(0 To 11) {}
とした後

1つずつ
For i As Integer = 0 To sb.Length - 1
sb(i) = New StringBuilder()
Next
するのですね。


そうですね。
恐らく、配列で行っている初期化は何に対する初期化なのかがわかっていらっしゃらないのだと思います。

例えば、List<StringBuilder> に置き換えて考えてみると、何故そうしなければならないのかが、わかりやすいのではないでしょうか?
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
なび
ぬし
会議室デビュー日: 2007/08/27
投稿数: 273
投稿日時: 2007-12-12 11:35
確かにそうです。

よく解っていません。

List<StringBuilder> に置き換えて
とありますが、どういうことなのでしょうか?

R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-12-12 11:47
引用:

なびさんの書き込み (2007-12-12 11:35) より:

List<StringBuilder> に置き換えて
とありますが、どういうことなのでしょうか?



VB は自信が無いので、C# で勘弁して下さい。

コード:


List<StringBuilder> sb = new List<StringBuilder>();
sb.Add(new StringBuilder());
sb.Add(new StringBuilder());
sb.Add(new StringBuilder());
sb.Add(new StringBuilder());



例えば、上記のように List コレクションに配列を置き換えてみると、sb は List<StringBuiler> というコレクションのオブジェクトを生成しています。
その後に、各要素ごとに新しい StringBuilderオブジェクトを生成します。

配列も同様で、あくまでも配列という器を生成しているだけで、器の中に入る物は、別に生成しなければならないという考え方になります。

詳細は、System.Array クラスについて調べてみると良いでしょう。

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog 満員御礼

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2007-12-12 11:48 ]

スキルアップ/キャリアアップ(JOB@IT)