DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C# クラスの利用方法

環境/言語:[VS2010 C#]
分類:[.NET]

C# 初心者,趣味のプログラマーです。
今回作成する予定のプログラムで クラスの使い方が分らないので教えてください

予定しているプログラムは2個のFormどちらからも クラス MemTableのメンバー変数をアクセスしたいのですが どちらかのFormで

MemTable tableRW;    // 変数の定義
tableRW = new MemTable();  // インスタンス作成

と宣言すれば宣言した方のFormからはアスセスできますが
 もう一方のFormからはどのようすればよいか教えてください

(両方のFormで同じように宣言すると 名前は同じですが異なるインスタンスが出来てしまいます)

 必要なところのみ抜粋

(1) MainForm
namespace RadioControl
{
public partial class MainForm : Form
{

MemTable tableRW; // FileData クラスの宣言
public MainForm() // コンストラクター
{
InitializeComponent();
tableRW = new MemTable(); // File Read,Write class
}


private void btn_Form_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
this.Hide();
new CtrlForm().ShowDialog(); // もう一方のFormを表示
this.Show();
this.WindowState = FormWindowState.Normal;
}

private void MainForm_Load(object sender, EventArgs e)
{
ここで MemTable のメンバー変数を設定し
切り替えたFormで参照する
tableRW.MemPad[0,0,0] = 7200;
}

}
}

 (2) CtrlForm
namespace RadioControl
{
public partial class CtrlForm : Form
{
public CtrlForm()
{
InitializeComponent();
}

private void CtrlForm_Load(object sender, EventArgs e)
{
ここでMemTableのメンバー変数にアクセスしたい 下記はうまくいかない
tableRW = new MemTable(); // File Read,Write class
int x = tableRW.MemPad[0, 0, 0]; // xは0である 期待値は 7200

}
}
}

 (3) MemTable クラス

namespace RadioControl
{
public class MemTable
{
public MemTable() // コンストラクタ
{
}

public const byte MEM_NUM = 60; //メモリーのチャンネル数

//メンバー変数の宣言
// 4=機種数 11=バンド数 3=1バンド3個 6=data
// 0=frequency 1=mode 2=agc 3=filterA 4=filterB 5=予備
public int[, , ,] BandReg = new int[4, 11, 3, 6];

// 4=機種数 5=Pad数 6=data
public int[, ,] MemPad = new int[4, 5, 6];

public byte[,] BandRegPos = new byte[4,11];
public byte[] BandNum = new byte [4];
  }
} 

よろしくお願いします。
■No29059に返信(68おじさんさんの記事)
> と宣言すれば宣言した方のFormからはアスセスできますが
>  もう一方のFormからはどのようすればよいか教えてください

このように複数のクラスから同じ値を利用したい場合、実にさまざまな方法があります。

1. ClassB へ該当メンバの参照を渡す
2. ClassA の該当メンバのスコープを internal 以上にして ClassB から参照する (ClassB には ClassA の参照が必要)
3. ClassA でも ClassB でもないところに定義して public なアクセスレベルにする
4. もう面倒だから public かつ static な変数でいいや
5. etc...

また 1. の方法ひとつにしてみても、実行したいメソッドの引数として渡したり、
プロパティを介して渡したりといろいろ方法はあります。
ご自身で適切な方法を取る必要があります (上で挙げた例の中には、ほぼすべての場面でお奨めできないものもありますので注意を^^;)

# マルチプル インスタンスの概念は理解されていながら、この手の質問は珍しいような気がします。
2011/09/17(Sat) 13:24:31 編集(投稿者)

■No29059に返信(68おじさんさんの記事)
> C# 初心者,趣味のプログラマーです。
> 今回作成する予定のプログラムで クラスの使い方が分らないので教えてください
>
> 予定しているプログラムは2個のFormどちらからも クラス MemTableのメンバー変数をアクセスしたいのですが どちらかのFormで
>
> MemTable tableRW;    // 変数の定義
> tableRW = new MemTable();  // インスタンス作成
>
> と宣言すれば宣言した方のFormからはアスセスできますが
>  もう一方のFormからはどのようすればよいか教えてください
>
> (両方のFormで同じように宣言すると 名前は同じですが異なるインスタンスが出来てしまいます)


Program.csにstatic宣言するのが一番楽です。趣味ならこれでいいかと思います。

namespase SampleApp
{
static class Program
{
    static public MemTable tableRW = null;//<--各フォームはこれを使う。

[STAThread]
static void Main()
{
//処理省略
}
}
}

この方法がまずいという場合は参照渡しやフォーム外で先に定義することが必要になるかと思います。
■No29061に返信(itiさんの記事)
> 2011/09/17(Sat) 13:24:31 編集(投稿者)
>
> ■No29059に返信(68おじさんさんの記事)
>>C# 初心者,趣味のプログラマーです。
>>今回作成する予定のプログラムで クラスの使い方が分らないので教えてください
>>
>>予定しているプログラムは2個のFormどちらからも クラス MemTableのメンバー変数をアクセスしたいのですが どちらかのFormで
>>
>> MemTable tableRW;    // 変数の定義
>> tableRW = new MemTable();  // インスタンス作成
>>
>> と宣言すれば宣言した方のFormからはアスセスできますが
>> もう一方のFormからはどのようすればよいか教えてください
>>
>>(両方のFormで同じように宣言すると 名前は同じですが異なるインスタンスが出来てしまいます)
>
>
> Program.csにstatic宣言するのが一番楽です。趣味ならこれでいいかと思います。
>
> namespase SampleApp
> {
> static class Program
> {
>     static public MemTable tableRW = null;//<--各フォームはこれを使う。
>
> [STAThread]
> static void Main()
> {
> //処理省略
> }
> }
> }
>
> この方法がまずいという場合は参照渡しやフォーム外で先に定義することが必要になるかと思います。
>
>
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板