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

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

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

C#の配列コピーについて

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

■88108 / inTopicNo.1)  C#の配列コピーについて
  
□投稿者/ kasumi (1回)-(2018/08/03(Fri) 00:18:30)

分類:[C#] 

VisualStudio 2017 でC#を書いている者です。

配列の扱いについて、
以下のようなコードを書くと、配列Aは配列Bと同じになるのですが、
これはこういうものなのでしょうか。
配列は参照型であることは理解したのですが、Aは要素数も3→5に変わっているので、
なんのエラーも無く配列AがBを参照する、ということに違和感がありますが・・・。
---------------------
int[] A = { 1, 2, 3};
int[] B = { 1, 2, 3, 4, 5};
A = B;
----------------------





引用返信 編集キー/
■88109 / inTopicNo.2)  Re[1]: C#の配列コピーについて
□投稿者/ kiku (46回)-(2018/08/03(Fri) 10:19:51)
下記サイトの「配列のコピー」の部分を見てください。
※一番下から探した方が早いです。
https://java2005.cis.k.hosei.ac.jp/materials/lecture11/array1.html

上記サイトは、Javaの例ですが、考え方は同じです。
図の部分のID750と記述がありますが
この値を値コピーしていることになります。

引用返信 編集キー/
■88110 / inTopicNo.3)  Re[1]: C#の配列コピーについて
□投稿者/ はまぐり (14回)-(2018/08/03(Fri) 10:23:11)
No88108 (kasumi さん) に返信

そういうものですよ
変数への代入は矢印で図を描いてみるとわかりやすいですよ

https://dotup.org/uploda/dotup.org1601306.png
引用返信 編集キー/
■88112 / inTopicNo.4)  Re[2]: C#の配列コピーについて
□投稿者/ はまぐり (16回)-(2018/08/03(Fri) 10:37:05)
No88109 (kiku さん) に返信
> https://java2005.cis.k.hosei.ac.jp/materials/lecture11/array1.html

全然関係ないですけど、リンク先の参照渡しの説明はこれはちょっとあれですね・・・違いますね
引用返信 編集キー/
■88120 / inTopicNo.5)  Re[3]: C#の配列コピーについて
□投稿者/ kiku (47回)-(2018/08/03(Fri) 11:49:20)
No88112 (はまぐり さん) に返信
> 全然関係ないですけど、リンク先の参照渡しの説明はこれはちょっとあれですね・・・違いますね

「配列のコピー」の部分をみてくださいとご案内しているのですが、
別の部分を見ていませんか?

引用返信 編集キー/
■88121 / inTopicNo.6)  Re[4]: C#の配列コピーについて
□投稿者/ はまぐり (18回)-(2018/08/03(Fri) 11:58:48)
No88120 (kiku さん) に返信

質問とはまったく関係ない話をしてみただけなので
興味ないなら無視して大丈夫です

「配列のコピー」の部分はそのとおりだと思いますよ


引用返信 編集キー/
■88122 / inTopicNo.7)  Re[1]: C#の配列コピーについて
□投稿者/ 魔界の仮面弁士 (1762回)-(2018/08/03(Fri) 12:02:06)
2018/08/03(Fri) 12:09:03 編集(投稿者)

No88108 (kasumi さん) に返信
> int[] A = { 1, 2, 3 };
代入式の右辺は、「{1, 2, 3} という int[] 型インスタンス」を作成しています。
それを左辺の、「int[]」型の変数 A から参照させています。


> int[] B = { 1, 2, 3, 4, 5 };
代入式の右辺は、「{1, 2, 3, 4, 5} という int[] 型インスタンス」を作成しています。
それを左辺の、「int[]」型の変数 B から参照させています。


> A = B;
右辺 B は、「{1, 2, 3, 4, 5} という int[] 型インスタンス」を指しており、
それを左辺の A に代入しています。

それ以前に保持していた {1, 2, 3} への参照は、この時点で失われ、
変数 A が参照しているインスタンスは、B が参照しているインスタンスと
同一のオブジェクトとなります。(データのコピーではなく、参照のコピー)


参照のコピーではなく、データのコピーが目的なら、
Clone メソッドや Array.Copy メソッドを使います。



> VisualStudio 2017 でC#を書いている者です。
2017 なら、こういう記述もあったりして。


int[] A = { 1, 2, 3 };
int[] B = { 1, 2, 3, 4, 5 };
ref int[] C = ref A;
Console.WriteLine(A.Length); // まだ 3
Console.WriteLine(B.Length); // まだ 5
Console.WriteLine(C.Length); // まだ 3
A = B;
Console.WriteLine(A.Length); // 5 に変わった
Console.WriteLine(B.Length); // 5 のまま
Console.WriteLine(C.Length); // 5 に変わった
引用返信 編集キー/
■88126 / inTopicNo.8)  Re[2]: C#の配列コピーについて
□投稿者/ Jitta (398回)-(2018/08/03(Fri) 12:31:54)
どうして「コピー」と考えたんだろう?
コピーと考えるから要素数の変化が〜とか気になるんじゃないかな?
代入文は、BASICでは「LET A=B」でした。
「AをBに等しくしなさい」という…あ、ここで「等しくするためにコピーする」になるの?
写すではなく、内容を複製する、なんだけど。
引用返信 編集キー/
■88128 / inTopicNo.9)  Re[2]: C#の配列コピーについて
□投稿者/ kasumi (2回)-(2018/08/03(Fri) 12:34:51)
みなさま

どうもありがとうございます、勉強になります。
私は最初に学んだ言語がFortranだったので、C#における配列の扱いに戸惑っていました。
Fortranと同様の配列演算をコーディングすると、とんでもないことになりますね・・・。

趣味でWindows用ツールをFortranで書いていたのですが、GUIが使えないのでなんだかなーと思っていたら、
VisualStudioが個人利用において無償で利用できることを知り、GUIも比較的簡単に作成できるC#へ足を踏み入れました。


-------(ご参考)以下、トピックの背景です------------------------------------------
@複数のメソッドで、ある配列Aを参照できるようにしたい。//Fortranでいうところの、変数モジュールのようなもの
AClass hogehoge を作成し、配列Aを宣言すれば、複数のメソッドで使えるのでは。
Bただし、配列Aは、あるメソッドSにより要素数が決定するので、配列A宣言時の要素数は不明 //Fortranでいうところの、Allocateはないものか・・・
C試しに、メソッドSにて、本来配列Aに入れたいデータを一時的な配列Bに入れ、hogehoge.A = B; と書いたらうまくいった。
Dなんでだろう・・・



解決済み
引用返信 編集キー/
■88133 / inTopicNo.10)  Re[2]: C#の配列コピーについて
□投稿者/ はまぐり (24回)-(2018/08/03(Fri) 13:23:44)
No88122 (魔界の仮面弁士 さん) に返信

弁ちゃん、私はねえrefはでっかい矢印だと思うんですよ
https://dotup.org/uploda/dotup.org1601393.png
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ