やまちゃんのオーディオブログ

既存のブログをこちらへ順次移動します。

C#

C#:Listのaddが思い通りいかないときは・・・参照渡しのいたずら

投稿日:

それから、①文字列のリストと、②文字列配列のリストと、③クラスのリストは、決定的に違うのは、
①は、文字列が値渡しであるのに、②、③は値が格納されている場所を返す参照渡しという点である。
②、③をループで回すと、奇妙な現象が起こりやすいので注意したい。
(「ListにAddする再、何故か全てのデータがAddしたデータに上書きされてしまいます。」参照)
どのサイトもaddコマンドでリストにデータを追加すると紹介されているが、addは、参照渡しなので、
addをするたびに.add(a)のaという変数を領域確保しないと、各要素が全部同じaの参照を渡してしまい、
値をaddするたびに、すべての要素が、新しく加えた時のaの値に変更されてしまう。
これも、1日ぐらい、はまった。

それを防ぐには、ループ内で、毎回、「new」により領域確保を行う。
ただし、ループ内でnewを定義すると、重複定義のエラーの問題が生じうる。
クラスのリストについてはこのサイトのとおり行う。普通にnewを繰り返していても、エラーが生じない。
文字列配列をnewで繰り返し宣言すると、2回目で重複定義のエラーが出てしまう。

これを防ぐには、addの直前で、{}によりローカル変数を設定し、”}”が終わった瞬間にディスポーズによりこの領域確保を廃棄してもらう。
例えば、テキストデータを読み込み、配列のリストに入れる場合に、以下のようにする。

List strlist =List ();
{string[] abc =new string[3];
abc[1]=readline;
strlist.add(abc);}

そうすると、2度目にループが回ってきても、すでに廃棄したのちだから、新しい領域が確保され、
かつ、重複定義のエラーも生じない。

Follow me!

-C#

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

no image

C#: iniファイルの読み出しと編集(重複する値、キーがあるとき)

C#では iniファイルの読み出し用のプロパティが設けられているが、 キーと値が1対1でなければならず、値が複数の場合には登録できない。 そこで、例えば、以下のような音楽ファイルの存在するフォルダを複 …

no image

C# XamarinでC# 日本語入力

C#で、コンソール型のラズパイ用のプレーヤーのプログラムを書いている。 コンソール上で、ファイルを選択したり、 コンソール型の例えばaplayなどのプレーヤーで、ファイルに応じて特定のコマンドを作成し …

[最近の記事]
2018年6月
« 5月    
 12
3456789
10111213141516
17181920212223
24252627282930

3PR エリア3 タイトル