26514


基本的なことかもしれないのですが、色々調べても分からなかった為質問させて頂きます。

プログラム全体で共有するクラスとそのクラスのインスタンスを作るにはどこにどう書いたらいいのでしょうか？

例）  
TESTclass というクラスがあり、public TESTclass tescls = new TESTclass() でインスタンスを作成し、  
そのインスタンスをForm1、Form2、Form3 ・・・ で使用したい。  
この、public TESTclass tescls = new TESTclass() をどこにどう書けば、プログラム全体で共有できるか？


CC BY-SA 3.0
2016-06-06T14:29:07.837
26509
2016-06-18T21:37:22.490
10614
question
c#
C# プロジェクト全体で共有するクラスのインスタンスを作成したい


アプリケーションのエントリポイントであるMain()内でインスタンスを作成しておけば各フォームで共有して使用できます。  
Visual
Studioで普通にフォームアプリケーションのプロジェクトを作った場合、Program.csというファイル内にMain()が含まれているはずです。


CC BY-SA 3.0
2016-06-06T14:59:32.080
26512
2016-06-06T14:59:32.080
9515
26509
answer


`static`フィールドの初期化子を使うのが良いと思います。

[code]

    class TESTclass
    {
        internal static readonly TESTclass tescls = new TESTclass();
    }
    
    // Form1.cs
    TESTclass.tescls.何らかの処理();
    
[/code]

上の例ではフィールドを`TESTclass`に定義していますが、別にどのクラスで宣言しても良いです。

このような静的フィールドの初期化は一度しか実行されないことが保証されているため通常の代入よりスレッドセーフです。

なお.NET Frameworkの習慣ではこのようなフィールドには`Default`という名前を付けることが多いです。


CC BY-SA 3.0
2016-06-06T17:03:21.377
26514
2016-06-06T17:03:21.377
5750
26509
answer


Formを継承するBaseFormというabstractクラスを間に挟んで、static constructor内でtesclsを作る。

[code]

    public abstract class FormBase : Form 
    {
    
       public static readonly TESTclass tescls;
    
       static FormBase(){
            tescls = new TESTclass();
       } 
    }
    
[/code]

後はFormA, FormB, FormCそれぞれがFormBaseを継承する。


CC BY-SA 3.0
2016-06-18T21:37:22.490
26843
2016-06-18T21:37:22.490
8506
26509
answer