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

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

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

Re[2]: クラスを配列で宣言する方法


(過去ログ 121 を表示中)

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

■72160 / inTopicNo.1)  クラスを配列で宣言する方法
  
□投稿者/ meme (16回)-(2014/05/21(Wed) 19:01:27)

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

クラスを配列で宣言する方法を探しています。


Stringを配列で宣言するとしたら
Dim str(10) As String
これで問題ないのですが
クラスでこれをしようとすると上手くいきません。

TestCls01というクラスがあったとして、それを配列で宣言しようとすると

Dim AryCls(10) As TestCls01

これは一応宣言はできてはいるのですが、AryClsの配列の中に実体が作られていないため(実体がないという表現で合ってるかな?)
AryCls(0) = New TestCls01
AryCls(1) = New TestCls01
AryCls(2) = New TestCls01
といった感じで配列のインデックスそれぞれにNewでTestCls01を入れています。

クラスなのでNewを入れてあげないといけないのはわかるのですが、インデックスすべてに
再度するのは手間になります。

これを
Dim AryCls(10) As New TestCls01
こんな感じで1行でまとめることはできないでしょうか?
(ちなみにこの書き方だとエラーになりました)

お分かりの方いらっしゃいましたらよろしくお願いいたします。


引用返信 編集キー/
■72162 / inTopicNo.2)  Re[1]: クラスを配列で宣言する方法
□投稿者/ 魔界の仮面弁士 (15回)-(2014/05/21(Wed) 19:41:28)
2014/05/21(Wed) 19:51:42 編集(投稿者)

No72160 (meme さん) に返信
> Stringを配列で宣言するとしたら
> Dim str(10) As String
> これで問題ないのですが

間違いではありませんが、VB には「Str関数」が存在しますので、
できれば別の変数名にしておいた方がよろしいかと。


> Dim AryCls(10) As New TestCls01
たとえ出来たとしても、その表現だと、

 'それぞれに同じインスタンスをセット
 Dim wk As New TestCls01()
 AryCls(0) = wk
 AryCls(1) = wk
      :
 AryCls(10) = wk


 'それぞれに異なるインスタンスをセット
 AryCls(0) = New TestCls01()
 AryCls(1) = New TestCls01()
      :
 AryCls(10) = New TestCls01()

のいずれの意味なのか、ハッキリしませんよね。


> こんな感じで1行でまとめることはできないでしょうか?

'それぞれに同じインスタンスをセットする
Dim a() As TestCls01 = Enumerable.Repeat(New TestCls01(), 11).ToArray()

'それぞれに異なるインスタンスをセットする
Dim b() As TestCls01 = Enumerable.Repeat(Function() New TestCls01(), 11).Select(Function(x) x()).ToArray()
Dim c() As TestCls01 = Enumerable.Select(Enumerable.Range(0, 11), Function(x) New TestCls01()).ToArray()
引用返信 編集キー/
■72177 / inTopicNo.3)  Re[1]: クラスを配列で宣言する方法
□投稿者/ Jitta (147回)-(2014/05/22(Thu) 22:41:19)
No72160 (meme さん) に返信

> これは一応宣言はできてはいるのですが、AryClsの配列の中に実体が作られていないため(実体がないという表現で合ってるかな?)
> AryCls(0) = New TestCls01
> AryCls(1) = New TestCls01
> AryCls(2) = New TestCls01
> といった感じで配列のインデックスそれぞれにNewでTestCls01を入れています。
>
> クラスなのでNewを入れてあげないといけないのはわかるのですが、インデックスすべてに
> 再度するのは手間になります。

1行ではありませんが、とりあえず空でよいから入れておくということであれば、

For (i as Integer = 0; i <= AryCls.Length; i = i+ 1)
  AryCls(i) = New TestCls01
Next

でよかったと思います。こう言うのじゃダメ?
引用返信 編集キー/
■72178 / inTopicNo.4)  Re[2]: クラスを配列で宣言する方法
□投稿者/ 魔界の仮面弁士 (18回)-(2014/05/22(Thu) 23:36:59)
No72177 (Jitta さん) に返信
> For (i as Integer = 0; i <= AryCls.Length; i = i+ 1)
>   AryCls(i) = New TestCls01
> Next
> でよかったと思います。こう言うのじゃダメ?

言語文法が崩壊していませんか… (^^;


'Visual Basic
For i As Integer = 0 To UBound(AryCls)
 AryCls(i) = New TestCls01()
Next

// C#
for(int i = 0; i <= AryCls.GetUpperBound(0); i++) {
 AryCls[i] = new TestCls01();
}

// JScript
for (var i:Int32 = 0; i <= AryCls.GetUpperBound(0); i++) {
 AryCls[i] = new TestCls01();
}


Jittaさんのコードでは「<=」演算子が使われていたので、
ここでは Length ではなく、UpperBound にて記載しています。



PowerShell なら、こういう書き方もできるかな。

$count = 5
$AryCls = @(foreach($v in (New-Object int[] $count)){ New-Object TestCls01 })
引用返信 編集キー/
■72180 / inTopicNo.5)  Re[1]: クラスを配列で宣言する方法
□投稿者/ WebSurfer (264回)-(2014/05/23(Fri) 07:41:18)
No72160 (meme さん) に返信

値型と参照型の違いと言った基本的なことは理解されているでしょうか?

値型と参照型の区別と違い
http://dobon.net/vb/dotnet/beginner/valuereference.html


あと、配列ではなくコレクションを使うという方法はご存知でしょうか?
(これを使ったからといって new しなくてすむと言うわけではありませんが)

Listジェネリック・クラス
http://www.atmarkit.co.jp/ait/articles/0602/11/news011_2.html
引用返信 編集キー/
■72355 / inTopicNo.6)  Re[2]: クラスを配列で宣言する方法
□投稿者/ meme (17回)-(2014/06/05(Thu) 13:38:04)

返信をくださった皆様、ありがとうございました。
書き込みが遅れてしまい申し訳ありませんでした。


魔界の仮面弁士さんのご指摘通り、配列に宣言するとき同じインスタンスなのか
異なるインスタンスなのかの判断が付かないという説明に納得がいきました。

宣言の仕方にはいろいろありますし、WebSurferさんのジェネリッククラスも
勉強になりました。

ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -