前提・実現したいこと
以下のサンプルコード内でForm1.csをその他のクラスから操作する際、参照を渡す(先頭アドレス)という方法を取りました
参照を渡す→その他のクラスからForm1.csを操作できるようになる というところまでは理解できたのですが
Form1.cs内の関数(メソッド)や変数にアクセスできる理由がいまいち理解できませんでした
その中で、クラスのメンバーのメモリ管理について理解を深めれば今回の疑問は解決できるのではないかと思い、今回の質問に至ります
質問内容は、「試したこと・考えたこと」の未解決部分です
試したこと・考えたこと
以下のコードにおいて、各メンバーにアクセスできる理由を考えました
解決済 -------------------------------------------------------------------
・Form1objに実体のアドレスがあるため、Other_2.csからForm1にアクセスできる
・ヒープ領域で管理するものは、基本可変のもの
・値型の場合でも、メンバ変数の場合ヒープ領域に格納される
未解決 -------------------------------------------------------------------
・Form1として確保された領域内で、Form1の各メンバー領域をランダムに取っているのか?(画像上から3行目のメモリイメージ図)
*上記のように動くと仮定した場合*
・各メンバーにアクセスするためには、Form1のアドレスが先頭から末尾まで分かっていないと探しようがないのではないか?
・先頭アドレスだけで、Form1の各メンバーにアクセスできる仕組みが知りたい
そもそも、解決済みの考えや、仮定の考えが間違ってるのではないか?と頭の中で無限ループしてしまっている状態です・・・
public void test() { Form1Obj.label1.AutoSize = true; Form1Obj.Form1_Method(); Form1Obj.A = 1; Form1Obj.B = true; Form1Obj.S = "あいうえお"; }
該当のソースコード
C#
1 public partial class Form1 : Form 2 { 3 4 private readonly Other _other; 5 public int A; 6 public bool B; 7 public string S; 8 9 10 public Form1() 11 { 12 InitializeComponent(); 13 14 //this:インスタンス自身(Form1)を格納する特別な変数 15 //otherインスタンスに対して自分の参照(先頭アドレス)を渡すことで、other内から自分(Form1)を操作できるようにするため 16 _other = new Other(this /*, 5)*/); 17 18 } 19 20 public void Form1_Method() 21 { 22 //何かの処理 23 } 24 25 } 26 27 class Other_2 //Form1を参照する 28 { 29 /// <summary> 30 /// Form1を示すメンバ変数(フィールド) 31 /// </summary> 32 public Form1 Form1Obj; 33 34 /// <summary> 35 /// コンストラクタでは、引数として渡された Form1型の変数 Form1Obj を自分(Other_2.cs)の★メンバ変数(フィールド) Form1Obj に格納している 36 /// </summary> 37 /// <param name="form1Obj"></param> 38 public Other_2(Form1 form1Obj) 39 { 40 //form1ObjはForm1の先頭アドレスを持っており、それを自分のメンバ変数(Form1Obj)に格納する 41 Form1Obj = form1Obj; 42 } 43 44 public void test() 45 { 46 Form1Obj.label1.AutoSize = true; 47 Form1Obj.Form1_Method(); 48 Form1Obj.A = 1; 49 Form1Obj.B = true; 50 Form1Obj.S = "あいうえお"; 51 } 52 }
補足情報(FW/ツールのバージョンなど)
.NET Framework4
Visual Studio 2010 Format Version 11.00
回答4件
あなたの回答
tips
プレビュー