32908


C#にて、インスタンスについてご教授をお願いいたします。。  
ソースファイルは、program.cs と Class1.cs の二つあります。  
program.csがメインとなります。  
以下に例えのプログラムを示します。

将来的に、プログラムは常時起動し、何か信号を受信したら、出力し、出力したらリセットはせず、待機状態にします。また、信号が来たら・・・の繰り返しです。  
出力の期待値は最終的に a=4 です。  
どの信号にも a=4 となるようにしたいです。

考えでは、信号がくるたびにclass1をnewし、Global.Cntが初期化された状態で使用されると思っています。  
しかし、初期化のされている様子は見当たらなく、ご質問いたしました。  
初歩的なことでのご質問お許しください。

順々に信号がくるのを模擬したプログラムです。

program.cs↓↓

[code]

    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 2; i++)　　//2回の信号が順々にきた
            {
                int a = 1;
    
                Class1 class1 = new Class1();
                a = class1.A(a);
                Console.WriteLine(a);
            }
        }
    }
    
[/code]

Class1.cs↓↓

[code]

    class Class1
    {
        public static class GlobalV
        {
            public static int Cnt = 0;
        }
    
        public int A(int a)
        {
            int ans = 0;
    
            GlobalV.Cnt++;
            ans = B(a);
    
            return ans;
        }
    
        public int B(int b)
        {
            int c = 2;
    
            b = GlobalV.Cnt + c + b;
            return b;
        }
    }
    
[/code]

続けてで申し訳ないのですが、もし、A信号の処理をしている最中に、  
B信号が来た場合、新たにclass1がインスタンスされた場合、A信号で処理していたclass1は併合もしくは消えてしまうのでしょうか。  
同時に来た時は・・・

[![画像の説明をここに入力](https://i.stack.imgur.com/Cck8Z.png)](https://i.stack.imgur.com/Cck8Z.png)

長文、分かりにくい質問で申し訳ありませんが、ご教授下さると幸いです。よろしくお願いいたします。


CC BY-SA 3.0
2017-02-23T14:26:51.517
32906
2017-02-23T17:00:43.703
19213
question
c#
C# インスタンスについて


GlobalVは内部クラスですがstaticクラスのためインスタンス間で値が共有されています。下記コードと等価です。

[code]

    class Class1
    {
        public static int Cnt = 0;
    }
    
[/code]

インスタンス生成時に初期化する予定ならCntはフィールドで保持すべきです。

ただし、「常時起動し、何か信号を受信したら、出力し、出力したらリセットはせず、待機状態」という条件を考えると、受信機インスタンスはプログラム中1つだけでいいように思います。

[code]

    static void Main(string[] args)
    {
        Receiver receiver = new Receiver();
        for (int i = 0; i < 2; i++)　　//2回の信号が順々にきた
        {
            int a = 1;
    
            a = receiver.A(a);
            Console.WriteLine(a);
        }
    }
    
[/code]

次に信号の連続受信についてですが、今回の実装では受信機インスタンスのスコープはループ内のみとなっています。そのため、ループの外から受信機インスタンスにアクセスすることはできず、  
近いうちにガベージコレクションで消える運命なので、「消えてしまう」といって差し支えありません。B信号で処理していたclass1も同様です。

余談ですが、今回の実装だとA信号の処理が終了するまでB信号の送信が行われません。そのため、同時に信号が来るということはありません。この辺りをどうするかは仕様によりますが、考えられるパターンはこんな感じですね。

  1. 送信は一気に行い、処理は順次行う：受信機にキューを実装して順次処理を行わせる。
  2. 送信は一気に行い、処理は受信ごとに行う：マルチスレッドで送信・処理を行う。

以上、お役に立てれば幸いです。


CC BY-SA 3.0
2017-02-23T17:00:43.703
32908
2017-02-23T17:00:43.703
20802
32906
answer