![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
初歩の質問で恐縮です。
配列の使い方で
public string[] item; と宣言しておいて、
下記例のように配列の長さを最初に宣言せず、その都度値を代入して見かけ上長さを動的に変え、Lengthの値を使うのは正しいやり方なのでしょうか?
string test = "A,B,C";
item = test.Split(',');
int len1 = item.Length;
.
.
.
test = "A,B,C,D";
item = test.Split(',');
int len2 = item.Length;
Console.WriteLine(" len1=" + len1 + " len2=" + len2);
結果 len1=3 len2=4
No.5ベストアンサー
- 回答日時:
> ”参照”なんですね。
C#配列は固定長だと思っていました。itemを可変長に宣言しているので、固定長ではありませんよね。
勿論、固定長に宣言したものに、上記コードを実施したらエラーになりますよ。
itemはSplit()結果を受けるための受け皿としてポインタを用意しているようなものです。(という表現の方が理解しやすいんでしょうか?)
> 質問が多少変わりますが、他の配列を代入するのではなく、
> string test = "A,B,C";
> item = test.Split(',');
> のように新たに値を設定した場合はどのような扱いになるのでしょうか?
全く同じ質問ですよね。
item変数に配列を代入していることに変わりはありません。
無駄にメモリを食うだけです。
こういうこと試したことありますか?
string[] item;
string test = "A,B,C";
item = test.Split(',');
string[] item2;
item2 = item;
item2[0] = "D";
Console.WriteLine($"{item[0]}, {item2[0]}");
結果は『D, D』となります。
itemとitem2が、いずれも同じメモリを参照していることが確認できると思います。
さらに、こういうこと試したことありますか?
string[] item;
string test = "A,B,C";
item = test.Split(',');
string[] item2;
item2 = test.Split(',');
item2[0] = "D";
Console.WriteLine($"{item[0]}, {item2[0]}");
結果は『A, D』と表示されます。
testを何度もSplit()すれば、その結果はすべて異なるメモリ領域扱いです。
2回目の代入先としてitemを指定すれば2回目Split()の実行結果が参照されることになり、元々参照されていた1回目Split()の実行結果へはアクセスできなくなります。
では1回目Split()の結果はどうなるのか?
プログラムの中ではアクセス不能な状態になり、メモリ上は消費していることになります。
ガベージコレクションによっていつかは開放されるものですが、明らかに無駄な動作です。
大変詳しい説明ありがとうございました。今まで深く考えず使用してきましたがソースコード全体を見直してみます。
ありがとうございました
No.4
- 回答日時:
> 配列のLengthとはそういうものだと頭から信じ込んでたのですが、ネット
> で調べると固定かResizeなどという情報にだけしか出会わず心配しており
> ました。
質問にある内容は、配列の要素を追加しているわけではありません。
異なる配列情報でitem変数の参照先を書き換えている動作です。
用意された配列に対して、要素を追加・削除をしたいという話なら別ですが、
質問にある内容は変数値を差し替えているわけですから、追加・削除ではありませんよね。
Lengthプロパティは、現在の配列の要素数を得るためのものなので、どんな配列を参照しているのかで都度変わります。
追加、削除を行いたい場合は、ANo.2にある通り、List<T>クラスなどを利用した方が手間とコストはかかりません。
No.3
- 回答日時:
特に問題ありませんが、
配列の長さに見かけも本物もありません。
配列の長さは配列生成時に配列の長さを明示することで決まります。
配列型の変数の宣言自体には配列長はなく、
配列型の変数は配列の参照を保持するだけです。
配列型の変数には様々な長さの配列の「参照」を随時代入できます。
No.2
- 回答日時:
C#はよくしらないんですが、Javaとして考えると、動的配列 Listを使いましょう、であってるかな。
配列はサイズは固定だと思います。
詳しくは言語使用を見た方がいいですね。
まあ、Listの中身は固定配列で、足りなくなったら切りなおすという実装だと思いますけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- Java java final 1 2022/06/10 22:49
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IF関数でEmpty値を設定する方法。
-
EXCEL VBA で、0から?1から?
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
配列にある重複要素を削除した...
-
C#の質問
-
VB.net 引数で配列変数を渡す際...
-
VBでbyte配列型のインスタンス...
-
重複なしでランダムに画像を表...
-
動的配列が存在(要素が有る)か...
-
Sourcearrayの読み方を教えてく...
-
フォームのピクチャーボックス...
-
{ } を使ったExcelの数式
-
VBで作った乱数を一度も重複さ...
-
変数を動的に作るには?
-
複数のテキストボックスに同じ...
-
ジャグ配列とは
-
遅延バインディングを使用でき...
-
配列プロパティをREDIMする方法...
-
エクセル:バグという名の仕様?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで配列の計算
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
C言語 重複しない4ケタの乱数...
-
変数を動的に作るには?
-
VB.net 引数で配列変数を渡す際...
-
応用情報技術者試験の令和元年...
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
VBでbyte配列型のインスタンス...
-
配列の要素数を超えた参照のコ...
-
複数のテキストボックスに同じ...
-
遅延バインディングを使用でき...
-
Visual C++ でコントロールを...
-
Excel VBAで配列の途中から(X)M...
-
C++、クラスメンバの構造体配列...
-
C言語で3次元配列の課題をして...
-
For文と配列
-
【MFC】GetCount()とGetSize()...
おすすめ情報
少し理屈?が理解できかけたような気がします。
例えば
public string[] item=new string[100];
のように最初に宣言しても後から
item=itemB
のようにitemに他の配列itemBを代入すればitem.LengthはitemBのLengthと同じになるということでしょうか?
”参照”なんですね。C#配列は固定長だと思っていました。
質問が多少変わりますが、他の配列を代入するのではなく、
string test = "A,B,C";
item = test.Split(',');
のように新たに値を設定した場合はどのような扱いになるのでしょうか?
以前の参照が廃棄されて宣言をし直したのと同じなのでしょうか?