c#の配列変数の宣言についてですが、

以下の2つの宣言は同じことなのでしょうか。
(1)int[] num = {1,2,3};
(2)int[] num = new int{1,2,3};

本では(2)のような定義していますが何かルールのようなものがあるのでしょうか。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

下記すべて同じ意味で、省略しているだけです。


int[] num = {1,2,3};
int[] num = new int[]{1,2,3};
int[] num = new int[3]{1,2,3};
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
おかげで理解できました。

お礼日時:2008/04/08 16:57

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVBのFunctionで、配列を引数や返却値にできますか?

配列の要素をソートするFunction を作成しようとしているのですが、
ソート対象配列を引数にして、返却値がソートされた配列になるように
したいと思ったのですが、その方法がわかりません。
それとも、引数に配列を入れることは不可能なのでしょうか。

Aベストアンサー

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです。



Option Explicit

Sub Main()
  Dim i As Long
  Dim Values() As Long
  
  '配列を初期化する
  ReDim Values(255) As Long
  For i = 0 To 255
    Values(i) = Rnd * 256
  Next i
  
  '配列をソートする
  Call QuickSortLong(Values())
End Sub

Public Sub QuickSortLong(ByRef Values() As Long, Optional StPos As Long, Optional EdPos As Long)

  Dim Ct As Long    'カウンタ
  Dim LastPos As Long  '配列最終番号
  Dim Buffer As Long   'バッファ
  
  '引数省略時の初期値
  If IsMissing(StPos) Then
    StPos = LBound(Values, 1)
  End If
  If IsMissing(EdPos) Then
    StPos = UBound(Values, 1)
  End If

  '終了番号が開始番号以下のときは処理を行わない
  If StPos >= EdPos Then
    Exit Sub
  End If

  '最初の値をバッファに格納
  Buffer = Values(StPos)
  '各バッファの値をスワップする
  '真ん中にある配列の値を最初の配列に代入する
  Values(StPos) = Values((StPos + EdPos) / 2)
  'バッファに格納された値を真ん中の配列に代入する
  Values((StPos + EdPos) / 2) = Buffer

  LastPos = StPos

  For Ct = StPos + 1 To EdPos
    If Values(Ct) < Values(StPos) Then
      LastPos = LastPos + 1
      '各バッファの値をスワップ
      Buffer = Values(LastPos)
      Values(LastPos) = Values(Ct)
      Values(Ct) = Buffer
    End If
  Next Ct

  '各バッファの値をスワップ
  Buffer = Values(StPos)
  Values(StPos) = Values(LastPos)
  Values(LastPos) = Buffer
  
  '再起呼び出し
  Call QuickSortLong(Values, StPos, LastPos - 1)
  Call QuickSortLong(Values, LastPos + 1, EdPos)
End Sub

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです...続きを読む

QC# 配列の変数宣言について。

C#についての質問です。

新たなint型の配列dataを作るため変数宣言文を、以下のように書きました。

int[] data;

すると、以下のような警告文が出ました。
『フィールド'IntArray.data'は割り当てられません。常に既定値nullを使用します。』
そこで調べてみたところ、「newしていないからこのような警告文が出る」ということがわかったので、以下のように書き換えました。

private int[] data = new int[];

すると今度は
『配列を作成するには、配列のサイズまたは配列の初期化子を指定する必要があります。』
というエラー文が出てしまいました。
このとき、配列のサイズも初期化子も指定したくない場合には、どのようにプログラムを書けば良いのでしょうか?

お分かりになる方がいらっしゃいましたら、ご助言をお願いします。

Aベストアンサー

private int[] data = null;
としてやれば警告は消えますよ

実際に使う段になって
data = new int[5];
などとインスタンス(実体)化してやりましょう
# new側の引数は 変数でもかまいません

QVB.NET: 型が配列のときの戻り値は?

仮に戻す値が無い場合は、私は Nothing かなと思います。
しかし、プログラマでもない素人。
VB.NET の学習も一カ月未満の超初学者。
もっとも、基本的なこととは思いますが答えが知りたいです。

「そうじゃない!ByRef を使う方が望ましい!」

という考え方もありかな!とも思っています。

Aベストアンサー

Functionの話ですね。
たった一つの答えというものはおそらく無くて、その戻り値を受け取る側でどうしているか、に影響されてくるのではないでしょうか。

例えば、そのメソッドの処理内でOKパターンではないと判別したとき、Nothingを返すことにより、待ち受ける側でNothingかどうかにより以後の処理を振り分けることが出来ます。
ただ、この場合は空の配列を返してもいいかもしれません。

もちろん、値を返さない場合があるという状況を作りたくないのであれば、FunctionではなくSubとして、ByRefの引数を使うという手もなくはないかも知れません。
この場合、事前に引数として用意しておかなければなりませんが。

大事なことかなと思うので2回言いますが、結局は「どうしたいか」が答えを決めると思います。

QC#でできてC++でできないことは?(C#のメリットとは?)

これから新しい言語として、C#もしくはC++の勉強をしたいと
考えています。

C#にできてC++にできないこと、あるいはその逆でC++にはできて
C#ではできない。ということがあれば、教えていただけないでしょうか?

感覚としてはC++であれば何でもできるという感じではあるのですが、
C#を使うメリットってどんなことがありますか?
やはり、ビジュアル開発(コントロールのDrag&Dropで画面開発ができる)
の簡単さというところがC#でのメリットでしょうか?

ちなみに私はこれまで、C -> VB -> Java といった順で言語を習得
してきました。

Aベストアンサー

>C#にできてC++にできないこと
無いでしょう。
基本的にC/C++の場合コンパイラの種類に依りますが
内部にアセンブラを書くこともできますから
C/C++で出来ないことはC#でも出来ません。
(勿論#1さんの言われるように言語レベルの仕様で出来ない事はあります。)

簡単さでいうとC#です。VB6の開発経験があるとのことですが
VC#だとVBのフォームを作成するような感じでインターフェースを
作っていけます。(一応VC++でも可能)

一方C#で出来ないことですが
当然ですがフレームワークに依存しないソフトを作る事が出来ません。
Javaで作ったソフトがJREを必要とするのと同じです。
他にはCPUの特殊な命令(SSEやMMX)を呼び出すとかドライバの開発等も出来ません。

ちなみにVC++でもフレームワークは使えるので
フレームワークのガベージコレクション等を使うことは可能です。
(ただフレームワークを使うならC#の方が簡単です。)

QArrayListの初期値に二次元配列を設定したい(VB2005)

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として設定するにはどのようにすればよいか、ということが質問内容です。

試しに(b)の部分を以下のようにしてみましたが、「1次元配列の値を変換できない」とのエラーが出ました。
Dim aryhoge As New ArrayList(New TextBox() {hoge(0), hoge(1), hoge(2)})

どうぞよろしくお願い致します。

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として...続きを読む

Aベストアンサー

Dim aryhoge As New ArrayList(hoge)

Q[C#]連想配列の中に配列を入れたい

いつもありがとうございます。

value["A"]["0"] = "a0";
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";
....

みたいなのを作りたいと考えているのですが以下のようにやっても、できませんでした。
何が悪いのかがわかりません。

Dictionary<string, Dictionary<string, string>> value = new Dictionary<string, Dictionary<string, string>>();
value["A"]["0"] = "a0"; ←
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";
...

実行すると、←のところで、
「指定されたキーはディレクトリ内に存在しませんでした。」
とエラーが出てしまいます。

上記のような配列を作りたい時はどのように書けばいいのでしょうか?
よろしくお願いします。

いつもありがとうございます。

value["A"]["0"] = "a0";
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";
....

みたいなのを作りたいと考えているのですが以下のようにやっても、できませんでした。
何が悪いのかがわかりません。

Dictionary<string, Dictionary<string, string>> value = new Dictionary<string, Dictionary<string, string>>();
value["A"]["0"] = "a0"; ←
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
va...続きを読む

Aベストアンサー

Dictionary<string, Dictionary<string, string>> value = new Dictionary<string, Dictionary<string, string>>();
value["A"] = new Dictionary<string, string>(); // これと
value["B"] = new Dictionary<string, string>(); // これを追加
value["A"]["0"] = "a0";
value["A"]["1"] = "a1";
value["A"]["2"] = "a2";
value["B"]["0"] = "b0";
value["B"]["1"] = "b1";

QVB6でやると構造体の配列になる変数をVB2008では何で作ればいいか

VB6でプログラムを作っていたときは
値のセットが配列になるとき
構造体を動的配列で宣言してデータを足して作りました。

VB2008で開発をすることになり
同じようなことをしたいのですが
もっと便利なやり方が登場したりするのでしょうか?
クラスで挑戦したのですが動的配列はできないようでした。

Aベストアンサー

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Structure

Public Class Program
  Public Shared Sub Main()
    Dim DataArray As MainGroup() = {}
    Array.Resize(DataArray, 3)

    With DataArray(0)
      .ID = 1
      Array.Resize(.SubGroups, 4)
      .SubGroups(0) = New SubGroup(101, 123, 456)
      .SubGroups(1) = New SubGroup(102, 234, 567)
      ' (略)
    End With

    With DataArray(1)
      ' (略)
    End With
  End Sub
End Class

■クラス+コレクション
Public Class MainGroup
  Public ID As Integer
  Public SubGroup As New System.Collections.Generic.List(Of SubGroup)
End Class

Public Class SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Class

Public Class Program
  Public Shared Sub Main()
    Dim DataList As New System.Collections.Generic.List(Of MainGroup)
    Dim NewMain As MainGroup

    NewMain = New MainGroup
    NewMain.ID = 1
    NewMain.SubGroup.Add(New SubGroup(101, 123, 456))
    NewMain.SubGroup.Add(New SubGroup(102, 234, 567))
    ' (略)
    DataList.Add(NewMain)
  End Sub
End Class

配列+クラスはNULL参照を発生させる可能性がある点で相性がよくありません。コレクション+構造体は、#2で挙げたようにデータ書き換えの手間がかかり、やはり相性はよくありません。
配列は要素数の変動に対してパフォーマンスが悪く、細かく増減させるには不向きです。コレクションは増減することを前提としている点や、削除した箇所を詰めたり途中に挿入したりが容易な点で優れています。
クラス or 構造体、配列 or コレクション をどう組み合わせるかはこれらのほか、ユーザビリティ・保守性・整合性・パフォーマンスなどと共に天秤にかけることになるでしょう。状況にあわせてうまく使い分けてください。


> addでどんどん追加して全体をループさせずに小項目IDを取得する方法

小項目IDがユニークであれば、リストコレクションではなく辞書コレクションを使うことでIDからクラスを取得できるようになります。クラスが保持しているデータをキーに使う場合は、コレクションを継承したクラスを作り、AddをShadowsで置き換えたほうがコーディングミスを防ぐことが出来ます。

■クラス+コレクションクラス
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

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, B...続きを読む

Q【C#】ハッシュテーブル(連想配列)の値が配列の場合について

はじめまして。
今回初めてハッシュテーブルを利用するのですが、不明な点があり、こちらへ質問を投稿させていただきました。

Hashtable ht = new Hashtable();
string[] str = {"明日","明後日","明々後日"};
ht["after"] = str;

以上のようにキーafterの値へ配列の代入を行ったのですが、値の配列を直接操作する方法がわからず困っております。

//値の[0]より文字列「明日」を取り出したい
string val = (string[])ht["after"][0];

ためしに上記の様に書いてみたものの、ビルド時に「角かっこ [] 付きインデックスを 'object' 型の式に適用することはできません。」というエラーが発生します。

初歩的な内容かと思いますが、お分かりになる方がおりましたら、ご回答のほどよろしくお願いいたします。

環境 VisualC# 2005 Express Edition

Aベストアンサー

普段VB.NETユーザーで、未検証の勘です。

string val = ( (string[])ht["after"]) [0];

という計算順序として認識されているならいいんですが,

string val = (string[]) (ht["after"] [0]);

という計算順序として扱われると

ht["after"] が Object、
それに大して0番目って何よ!?

って言われるんじゃないかと。

#ところで,Genericsの型として配列って渡せるのかなー
http://unboxedsolutions.com/sean/archive/2005/07/06/671.aspx

QVBスクリプトの配列数字をJAVAスクリプトで使うには

表題があまり良くないですが
VBSでページを作っています

その中で
ページ閲覧者がテキストボックスに値を記入したときに
JAVAスクリプトのonchangeでJAVAスクリプトへ飛んで

VBスクリプトで定義した配列の値を代入したいのですが
うまくいきません
飛んでいった先のコードが
<script type="text/javascript">
<!--
//値の代入
function hoge(FRM){
FRM.hoge1.value=ここにVBスクリプトの配列
}
// -->
</script>
これだけのことなのですが
配列を直接数字で書くと
FRM.hoge1.value=<%=atai(1)%>
hoge1にはきちんと値が入力されます

しかし この1と言う数字の所に
FRM.hoge2.value の値をいれてやろうとすると
イメージとしては
FRM.hoge1.value=<%=atai(FRM.hoge2.value )%>
なんですが、これではエラーがでます(当然ですよね)
色々"" でくくったり & や + ()などの
組み合わせでやってもうまくいきません

どなたか正しい構文か方法を教えてください
よろしくお願いします


 

表題があまり良くないですが
VBSでページを作っています

その中で
ページ閲覧者がテキストボックスに値を記入したときに
JAVAスクリプトのonchangeでJAVAスクリプトへ飛んで

VBスクリプトで定義した配列の値を代入したいのですが
うまくいきません
飛んでいった先のコードが
<script type="text/javascript">
<!--
//値の代入
function hoge(FRM){
FRM.hoge1.value=ここにVBスクリプトの配列
}
// -->
</script>
これだけのことなのですが
配列を直接数字で書くと
FRM.hoge1.v...続きを読む

Aベストアンサー

何かを勘違いされていると思います。

umadura4747さんが言われている、VBScriptの配列と言うのは、サーバー上での変数を指し、JavaScriptの値と言うのは、クライアント上の変数を指しています。
つまり、次元が違うため実行できないのです。

解決方法としては、

1. VBScriptという配列がサーバー上でしか定義できない場合
 以下のようなJavaScriptのソースを生成するために、ASPコードを追加してあげる。

 var a = new Array("a", "b", "c");

2. クライアント側でも配列が定義できる場合
 先ほどと同じコードをあらかじめJavascriptで定義しておく

ASPとは、サーバー上で動的にHTMLソースを生成することを目的としています。
まずは、やりたいことをHTMLソースで記述し、それを生成するためには、どういったASPコードを書くかを考えてください。

QC#で、色んな型を1つの配列に格納するには?

C#で、色んな型を1つの配列に格納するには?

配列名をaとすると、a[0]は1、a[2]は3.0、a[3]は"hello"のように、どんな型でも格納できる方法はありますでしょうか。
どうぞよろしくお願いします。

Aベストアンサー

Object [] obj = new Object[3];

obj[0] = 0;
obj[1] = 0.1;
obj[2] = "hello";

で可能です。
Objectの配列から取り出す場合は、
型が何かを判定する必要があるため、
効率的ではないとは思いますがこれで可能です。

余計なお世話かもしれませんが、
型が同じでない場合は、配列で保持するのではなく、
クラスか構造体を作った方が賢いと思いますけど。


人気Q&Aランキング