8

私はスクリプト言語に慣れています。PHP、Javascript など、比較的単純な Java および C# アプリをいくつか作成しました。これは、私が繰り返し答えを必要としてきた質問であり、私だけではないと思います.

私がJavascriptを使用しているとしましょう。

GUI によって呼び出される関数 A() があり、値を取得します。

これも GUI によって呼び出される関数 B() はその値を必要としますが、関数 B() は任意の回数、A() の後に任意の長さの時間呼び出されます。

A() で毎回値を再計算したくありません。

例として、ログオン資格情報があります。A() はユーザー名を要求し、B() は呼び出されるたびにその値を使用してログに追加します。

これには、おそらくグローバル変数を使用するだけです。

さて、C#. グローバル変数なし!どうすればいいですか?

編集: 答えを楽しんでいますが、「グローバルを使用しないようにしてください」というコメントがたくさんあります。私は理解していますが、この要件の代替パターンを聞きたいです。

4

5 に答える 5

5

これは良い習慣ではありませんが、本当に必要な場合は、いくつかの方法があります。

  1. Web アプリ: セッションやアプリケーション スコープなど、ある種のコンテキストに変数を配置できます。
  2. デスクトップ アプリ: オブジェクトを作成し、常にアクティブなオブジェクトを持つクラスのプロパティとして格納できます。
  3. あらゆる種類のアプリ: public static プロパティを使用します。それは誰にでも見えます。
于 2009-05-21T22:41:20.830 に答える
4

まず、グローバルが本当に必要かどうかを常に自問してください。多くの場合、必要ありません。でもどうしても持っていくなら…

これを行う最善の方法は、賢明な名前のクラスに静的プロパティを設定することです。これは効果的にグローバル変数になります

public class Credentials
{
  public static string Username {get;set;}
}

//...somewhere in your code

Credentials.Username = "MyUserName";

編集:

ここにいる何人かの人々は、グローバル変数は悪いという包括的な声明を述べており、私はこの意見に同意します.

ただし、グローバルが悪い理由を検討する必要があります。カプセル化のルールに違反しているため、グローバルはほとんど悪いと見なされています。ただし、静的データは必ずしも悪いわけではありません。静的データの良い点は、カプセル化できることです。上記の例は、その非常に単純化された例です。おそらく、実際のシナリオでは、静的データを同じクラスに含めることになります。 Login クラスや User クラスなど、アプリにとって意味のあるものは何でも、資格情報を使用して他の作業を行います。

于 2009-05-21T22:40:37.070 に答える
1

おそらくSingleton Patternを使用する必要があると思います。

マルチスレッド アプリケーションを使用する場合は、シングルトンのインスタンスのプロパティへのアクセスがスレッドセーフであることも確認する必要があります。

いつものように、アプリケーションにあらゆる種類のグローバルを導入することについて慎重に検討してください。ただし、それを使用することを恐れないでください。たとえば App.Settings のように、「悪い」ものは何もありません。

MSDNのこの記事では、c# でシングルトンを正しく作成する方法について説明しています。

于 2009-05-21T22:45:08.997 に答える
0

C# でグローバル変数と同様の動作を実現する方法の 1 つは、静的クラス メソッドとクラス変数を使用することです。静的クラスのメソッドと変数は、C# では単一のインスタンスを持ち、他の言語のグローバル変数に多少似ています。

とはいえ、あなたの問題については、設計上の問題のように聞こえます。C# はオブジェクト指向設計に重点を置いています。あなたが与えた問題は、より良い OOD があなたの問題を解決するのではないかと思います。

于 2009-05-21T22:40:40.753 に答える
0

関数 A はクラスの一部になります (C と呼びます)。次に、関数 A はログオン資格情報を格納し、資格情報を取得する関数 (または C# ではプロパティ) を提供します。必要な場合は、単にプロパティを使用して保存されている資格情報を取得し、それらを関数 B (別のクラス) に渡すことができます。

class C
{
    public void functionA()
    {
         credentials = obtainCredentials;
    }

    private LogonCredentials _logonCredentials = null;

    public LogonCredentials logonCredentials
    {
        get { return _logonCredentials; }
    }
}

class D
{
    public void functionB(LogonCredentials credentials)
    {
       //do stuff
    }
}

///other stuff
///other function ...
    ...
    instanceC = C();
    instanceC.functionA();
    ///more stuff here
    instangeD = D();
    instanceD.functionB(instanceC.logonCredentials);
于 2009-05-21T22:42:53.963 に答える