DOBON.NETプログラミング道掲示板
(現在 過去ログ4 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34359 / inTopicNo.1)  Newの使い方間違ってますか?
  
□投稿者/ VBはじめました 一般人(13回)-(2019/11/05(Tue) 13:47:26)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    フォームのインスタンスを作る方法として次の4つの方法がある(それ以上あるかも?)とします。
    Dim Frm1 As Form
    Frm1 = New Form 'Sub Form.New()
    Dim Frm2 As Form = New Form 'Sub Form.New()
    Dim Frm3 = New Form 'Sub Form.New()
    Dim Frm4 As New Form 'Sub Form.New()

    一方、Integer型の配列のインスタンスを作る方法として、対比させると
    次のようになると思います。
    Dim Int41 As Integer()
    Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer()
    Dim Int43 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    Dim Int44 As New Integer() 'Sub Integer.New()

    フォームの場合、Newキーワードのところにカーソルを持っていくと
    各行のコメントが表示されます。
    Int44だけ、違った表示がされ、配列になりません。
    なぜですか?
    詳しい方いらっしゃいましたら教えて頂けませんでしょうか?
    宜しくお願いいたします。
引用返信 削除キー/
■34360 / inTopicNo.2)  Re[1]: Newの使い方間違ってますか?
□投稿者/ 魔界の仮面弁士 大御所(1250回)-(2019/11/05(Tue) 14:16:30)
  • アイコンNo34359に返信(VBはじめましたさんの記事)
    > Dim Frm4 As New Form 'Sub Form.New()
    これは
     Dim Frm4 As New Form()
    の省略形です。

    メソッドやコンストラクタの呼び出し時には、
    引数を指定するための丸括弧が必要とされますが、
    引数が 0 個の場合に限り、丸括弧を省略できます。


    > Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer()
    こちらの括弧は引数指定のためのものではなく、配列宣言を意味します。

    > Dim Int41 As Integer()
    > Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    この丸括弧も、配列宣言のためのものですね。
    Int42 と同様、宣言部と配列初期化子を組み合わせて
     Dim Int41 As Integer() = New Integer() {1, 2, 3, 4, 5}
    とも書けます。


    > Dim Int43 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    > Dim Int44 As New Integer() 'Sub Integer.New()
    前者の丸括弧は「配列」のためのものです。※配列初期化子
    後者の丸括弧は「引数」のためのものです。※構造体の既定のコンストラクタ

    先の Form 宣言と対応する形で並べれば、
     Dim Frm4 As New Form() 'Form クラスの引数0個のコンストラクタ呼出
     Dim Int44 As New Integer() 'Integer 構造体の既定のコンストラクタ呼出
    となります。どちらも引数指定です。


    引数 0 個の場合、丸括弧を省略できますので、
     'Dim Int44 As New Integer()
     Dim Int44 As New Integer
    とするのは OK ですが、配列宣言の括弧を省略すると意味が変わってくるため
    Int41〜Int43 については丸括弧が必須です。


    Dim Int44 As New Integer()
       ↓
    Dim Int44 As Integer = New Integer()
       ↓
    Dim Int44 As Integer = 0
引用返信 削除キー/
■34361 / inTopicNo.3)  Re[1]: Newの使い方間違ってますか?
□投稿者/ 魔界の仮面弁士 大御所(1251回)-(2019/11/05(Tue) 14:25:15)
  • アイコン2019/11/05(Tue) 14:33:59 編集(投稿者)

    No34359に返信(VBはじめましたさんの記事)
    > Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer()
    > Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer()

    配列のインデックスを明示することもできますね。(各要素はゼロになる)
     Dim Int46(4) As Integer
     Dim Int47(0 To 4) As Integer
     Dim Int48(0 To -1) As Integer
     Dim Int49(-1) As Integer


    コンストラクタ引数の丸括弧やメソッド引数の丸括弧は省略できますが、
    代入式の右辺にある配列初期化子については、
    丸括弧や波括弧を省略することが出来ません。


    ' これらの括弧は省略できない
    Int46 = New Integer(4) {}
    Int46 = New Integer(4) {1, 2, 3, 4, 5}
    Int46 = New Integer(0 To 4) {}
    Int46 = New Integer(0 To 4) {1, 2, 3, 4, 5}
    Int49 = New Integer(0 To -1) {}
    Int49 = New Integer(-1) {}
    Int49 = New Integer() {}


    そして
     Dim Int43 = New Integer() {1, 2, 3, 4, 5}

     Dim Int43 As New Integer() {1, 2, 3, 4, 5}
    と記述できない理由は、『New Integer()』の時点で、
    配列ではなく「コンストラクタの指定」と見做されるためです。

    最近のバージョンでは、型推論が利用できるため、
     Dim Int43 = {1, 2, 3, 4, 5}
    と書いたとしても、Integer 型の一次元配列としてコンパイルされますね。



    また、
     Dim Int42() As Integer = New Integer()

     Dim Int42() As New Integer()
    と書けない理由は、New の丸括弧と配列の丸括弧が同居すると、
    意味が曖昧になるという理由によって禁止されているためです。
引用返信 削除キー/
■34362 / inTopicNo.4)  Re[2]: Newの使い方間違ってますか?
□投稿者/ VBはじめました 一般人(14回)-(2019/11/05(Tue) 16:07:22)
  • アイコン魔界の仮面弁士さん いつも有難う御座います。

    質問の答えとしては、
     Dim Int42() As New Integer()
    と書けない理由は、New の丸括弧と配列の丸括弧が同居すると、
    意味が曖昧になるという理由によって禁止されているためです。
    だけで、済むところを、凄い労力をかけて懇切丁寧に、記載して頂き、ありがとうございます。理解できていなかったものばかりでとても勉強になります。

    無駄にしないように、何度も、熟読して理解していきたいと思います。

    重ね重ね、有難う御座いました。


引用返信 削除キー/
■34363 / inTopicNo.5)  解決済み押し忘れ
□投稿者/ VBはじめました 一般人(15回)-(2019/11/05(Tue) 16:08:14)
  • アイコン有難うございました
解決み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -