2011-10-18 8 views
4

ほとんどの変数をフォームのクラスレベルに配置するのは悪い習慣ですか?これらはグローバル変数とみなされますか?Winform変数スコープ

クラスレベルで宣言するときに、複数のコントロールの変数を使用しています。

答えて

2

これらはクラスレベルのグローバルと見なされます(アプリケーションのグローバルと区別するため)。この場合、クラスに対するより重要な区別は、クラスに対するprivateです。

クラスレベルのグローバルには用途があるので、間違いなく悪い習慣ではありません。プライベートクラスのグローバルの場合は、property accessorsに公開することをお勧めします。たとえば、次のように、その値は、あなたのクラスへの内部ロジックによって制御されている

  • public readonlyプロパティ。 (セッターでカスタム検証ロジックを有効にする。)の両方setgetアクセサと

  • public性質

しかし、私はそれがそうでなければ必要でない限り、物事はローカル作成することをお勧めしますと言うでしょう。その理由は、クラスのインスタンスに属する少ない可変状態を持っているということですので、このようなバグの少ない可能性がある。

private int EvilMethod1() { 
    x = (int) Math.Pow((double) y, 2); 
    return x; 
} 

private int EvilMethod2() { 
    y = (x + y) * 2;      
    return y; 
} 

// Assignments depend on the current values of x and y, 
// as well as yielding unexpected side effects. 
private void PureEvil() 
{ 
    // Return value depends on current y; has side effect on x while assigning y. 
    y = EvilMethod1(); 

    // Return value depends on current x and y; has side effect on y while assigning x. 
    x = EvilMethod2(); 
} 
0

は、彼らはあなたのフォームの意図が何であるかを知らず、クラスForm1

0

にプライベートで、それが何をやっていることは良いか悪いかどうかを言うのは難しいです。ここに示す変数はクラススコープを持ち、プライベートなので、Form1の外部にはアクセスできず、「グローバル」とはみなされません。

本当にグローバル変数が必要な場合は、プライベート静的変数とパブリック静的アクセサ/ミューテータ(C#のプロパティ)を使用して静的クラスを作成し、publicプロパティを通じて変数にアクセスします。例については、this answerを参照してください。

4

私が質問から得られるのは、フォームに依存しない個別フォームとして使用している場合、すべてのこれらの変数はそのクラスのプライベート変数になります。フォームが他の場所から呼び出された場合。それはまた、私的な変数になります。本当に明確な設計をしたいのであれば、他のクラスに公開するプライベート変数に対してパブリックプロパティを作成することができます。

このようにして、読み取り専用のプロパティを作成して、他のクラスが変更できないもののアクセスすることができるようにすることで、他のクラスへのアクセスをプライベート変数に制限することができます。

1

それは変数が使用されどのような依存が。

1つのメソッド内でのみ使用される場合は、そのメソッドに対してローカルである必要があります。

クラスの状態を記述し、複数の場所で使用する場合は、クラスメンバとして宣言する必要があります。

2

これらはグローバル変数とはみなされません。 Form1クラス内でのみグローバルであり、プログラム全体ではありません。