5

私の質問は完全にばかげていると思いますが、答えを知らなければなりません。

この状況で変数を一度だけ初期化することは可能ですか?

    static void Main()
    {
        while (true)
        {
            MethodA();
            MethodB();
        }
    }

    private static void MethodA()
    {
        string dots = string.Empty;    // This should be done only once

        if (dots != "...")
            dots += ".";
        else
            dots = string.Empty;

        Console.WriteLine(dots + "\t" + "Method A");
        System.Threading.Thread.Sleep(500);
    }

    private static void MethodB()
    {
        string dots = string.Empty;    // This should be done only once

        if (dots != ".....")
            dots += ". ";
        else
            dots = string.Empty;

        Console.WriteLine(dots + "\t" + "Method B");
        System.Threading.Thread.Sleep(500);
    }

もちろん、メソッドから文字列ドットを初期化することはできますが、コードを混乱させたくはありません。これは、他のループ(forなど)でも実行できません。これをどのように解決するか、または私が普通に考えるのはとても愚かですか?

前もって感謝します。

編集:サンプルコードをより実用的なものに変更しました。必要な出力は次のとおりです。

.    Method A
.    Method B
..   Method A
..   Method B
...  Method A
...  Method B
     Method A
.... Method B
.    Method A
.....Method B

4

5 に答える 5

3

ドットをメソッドの外側(メソッドのクラス内)に残したくないと言った場合は、少なくとも後で渡すことができるように、メソッドから値を返す必要があります。これにより、その状態が維持されます。

string Method(string dot = string.Empty)
{
   if(dot == "...") return string.Empty;
   else return dot + ".";
}

var result = Method(Method(Method(Method(Method(Method()))))) // etc...

編集:あなたの編集された質問はあなたの最初の問題をより実用的にしません。それでも同じ問題が発生します。Xが必要ですが、C#にはXがありません。代わりにC++またはVB.NETを使用してください。

あなたの質問への答え

「この状況で変数を一度だけ初期化することは可能ですか?」

申し訳ありません、いいえ!

于 2012-07-20T16:22:14.990 に答える
3

クラスに保持dotsし、クラスの作成時に初期化できます。つまり、

string dots = string.Empty; 
private void Method()
{
    if (dots != "...")
        dots += ".";
    else
        dots = string.Empty;
}
于 2012-07-20T16:09:38.127 に答える
2

他の言語 (C++) では、任意のスコープで静的変数を宣言できます。これで問題は解決しますが、C# では関数内で静的変数を宣言することはできません。これは実際には C# FAQ です:なぜ C# は静的メソッド変数をサポートしないのですか? .

この設計上の特徴は、従来の方法ではやりたいことができないことを意味します。カリー化で特に狡猾なことができるかもしれませんが、既存のプログラム構造を台無しにしたくない場合は、それで終わりです。あなたが望むものを得るネイティブコードを書く方法があると確信していますが、それは悪い考えのように感じます.

簡単に言えば、スコープ外に存続するデータを求めているということです。C# では、主な (唯一の?) 対策は、そのデータのスコープを拡大することです。

于 2012-07-20T16:33:36.287 に答える
1

メソッドの呼び出し間で永続的なデータを探しているため、呼び出しの外にデータ要素が必要です。C# には静的ローカル変数がありません。

この Stackoverflow の投稿を読むことを検討してください。

于 2012-07-20T16:10:58.153 に答える
0

C ++のように静的ローカル変数を考えていますか?ここで説明するように、C#ではサポートされていません。

于 2012-07-20T16:27:58.510 に答える