

初歩的な質問で恐縮なのですが、質問させて頂きます。

言語：C＃

現在、以下の順で動くアプリを作成中です。  
ファイルデータを読み込む → 読み込んだデータを変換処理 → 変換して出力  
以上の処理を。勉強のため各処理を別ファイル、別クラスにしています。

ByteWorkという変数の中にファイルデータを読み込んだり、変換、出力したいと思っています。  
その際のByteWorkのインスタンスの場所と各関数を呼ぶ時の引数戻り値等をどのように  
したら上手く動くか、行き詰っています。  
ByteWorkのインスタンスする際に取る要素数は、読み込んだファイルデータのbyte数を取るようにしており、また、ByteWorkに記憶させるため、Readクラスに入れているのですが・・・  
これでは、Re.ReadFileMethod()を抜けたら消えてしまうのではないかと考えています。

どのようにしたら上手く動くかご指導ご鞭撻のほどよろしくお願いいたします。

ファイル構成と疑問点があるプログラムを示します。  
途中のプログラムで申し訳ないですお許しください。  
Form1.cs：メイン、各処理の呼び出し  
Read.cs：ファイルデータ読み込み  
Convert.cs：読み込んだデータを変換  
Out.cs：出力

Form1.cs↓↓↓↓↓↓

[code]

        public Form1()
        {
            InitializeComponent();
        }
    
        //ボタン押すと処理開始
        private void ConvertB_Click(object sender, EventArgs e)
        {
            // 読み込み
            Read Re = new Read();
            Re.ReadFileMethod();
            //変換
            Convert Cn = new Convert();
            Cn.ConvertMethod();
            //出漁
            OutPut Op = new OutPut();
            Op.OutputMethod();
        }
    }
    
[/code]

Read.cs↓↓↓↓↓↓

[code]

    public class Read
    {
        public void ReadFileMethod()
        {
            FileStream fs = new FileStream(@"C:\cWork\bin.bin",FileMode.Open);
            byte[] ByteWork = new byte[fs.Length];
            fs.Read(ByteWork,0,ByteWork.Length);
            fs.Close();
        }
    }
    
[/code]


CC BY-SA 3.0
2017-02-04T10:46:01.077
32380
2017-02-05T00:09:58.523
19213
question
c# アルゴリズム
C#でのソースファイル間でのデータ


危惧されているとおり、`ByteWork`はメソッド内のローカル変数ですのでメソッドの処理終了後は参照されていない状態となり、そのうち破棄されますし他のコードから参照することはできません。このような場合、通常は戻り値で処理結果を呼び出し元に返します。まず`ReadFileMethod`の戻り値を

[code]

    public byte[] ReadFileMethod()
    {
        FileStream fs = new FileStream(@"C:\cWork\bin.bin",FileMode.Open);
        byte[] ByteWork = new byte[fs.Length];
        fs.Read(ByteWork,0,ByteWork.Length);
        fs.Close();
    
        return ByteWork;
    }
    
[/code]

と書き換えます。呼び出し元では変数宣言と初期化を追加して

[code]

    Read Re = new Read();
    byte[] ByteWork = Re.ReadFileMethod();
    
[/code]

とすればよいです。

この変数を`ConvertMethod`に渡すには仮引数`ByteWork`を追加して

[code]

    class Convert
    {
        public byte[] ConvertMethod(byte[] ByteWork)
        {
            // 実際の処理
        }
    }
    
[/code]

などと宣言し、

[code]

    Convert Cn = new Convert();
    byte[] ByteWork2 = Cn.ConvertMethod(ByteWork);
    
[/code]

のように実際の引数を指定して呼び出してください。


CC BY-SA 3.0
2017-02-04T11:41:45.343
32381
2017-02-04T11:41:45.343
5750
32380
answer


直接的な回答ではないのですが、`Read.ReadFileMethod()`が担う処理、ファイル全体の読み込みについては[`File.ReadAllBytes()`メソッド](https://msdn.microsoft.com/ja-
jp/library/system.io.file.readallbytes\(v=vs.110\).aspx)が用意されています。`Read.cs`に独立させるまでもなく`Convert.cs`内でこのメソッドを呼び出すだけで済みます。


CC BY-SA 3.0
2017-02-05T00:09:58.523
32389
2017-02-05T00:09:58.523
4236
32380
answer