前提・実現したいこと
データのリストを作成するにあたり、データは呼び出し先の関数で作成し、呼び出し元でリストに追加する処理を実装します。
データは多種多様な変数を扱いたいのでクラスで定義します。
クラスには辞書型の変数を含み参照渡しになるため、呼び出し先で都度新規インスタンスを作成し、その新規インスタンスを返します。
作成したソースコード
下記のようなコードにて期待した通りの動作になりましたが、スコープについて理解が浅いためか不安が残っています。
C#
1public class Test1{ 2 public static void Main(){ 3 DataPlus dataPlus1 = new DataPlus(); 4 List <Data> mainData = new List <Data>(); 5 6 mainData.Add(dataPlus1.DataInit()); 7 mainData.Add(dataPlus1.DataInit()); 8 mainData.Add(dataPlus1.DataInit()); 9 10 mainData[1].a["key1"] = "valuex"; 11 mainData[2].a["key1"] = "valuey"; 12 13 System.Console.WriteLine(mainData[0].a["key1"]); // value1を期待 → ok 14 System.Console.WriteLine(mainData[1].a["key1"]); // valuexを期待 → ok 15 System.Console.WriteLine(mainData[2].a["key1"]); // valueyを期待 → ok 16 } 17} 18 19public class Data{ 20 public Dictionary <string, string> a = new Dictionary <string, string>(); 21} 22 23public class DataPlus{ 24 public Data DataInit(){ 25 Data subData = new Data(); 26 subData.a["key1"] = "value1"; 27 return subData; 28 } 29}
疑問点
Q1. dataPlus1.DataInit()の返り値は参照渡し、すなわち"Data subData = new Data();"で作成したインスタンスのポインタと理解していますが正しいでしょうか。
Q2. Q1が正しいとして、このコードが期待した動作になるのは正しいのでしょうか。それとも本来は誤ったコードであり、期待した通りの動作になっているのは偶然なのでしょうか。
<Q2補足>
dataPlus1.DataInit()内で作成されたインスタンスであるsubDataは「dataPlus1.DataInit()が終了したらいつでも破棄して良いメモリ領域」のような扱いになるものかと思っていました。
しかし実際は上記コードにてメモリ領域は保持され、期待した通りの値を返しています。
このため、結果から以下のように想像しています。
・C#のコンパイラが「subDataが指すメモリ領域はdataPlus1.DataInit()の終了後も他の関数によって使用されている」ことを認識し、当該メモリ領域を破棄しないようなコードを作成している?
あるいは
・C#の実行環境が同様に認識し、当該メモリ領域を破棄しないよう管理してくれている?
この想像が正しければ良いのですが、そうではなくunpredicableな動作がたまたま意図通りになっていることを危惧しております。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/20 06:25