2

私は静的関数を持っています:

static string GenRan()
{
    List<string> s = new List<string> {"a", "b"};
    int r = Rand();
    string a = null;

    if (r == 1)
    {
        a += s[0];
        s.RemoveAt(0);
    }
    if (r == 2)
    {
        a += s[1];
        s.RemoveAt(1);
    }
    return a;
}

しかし、もちろん関数を呼び出すたびにリストがリセットされるので、静的関数の外からリストにアクセスしたいと思います。

方法はありますか?

私は試した:

static void Main(string[] args)
{
    List<string> s = new List<string> {"a", "b"};
    string out = GenRan(s);
}

static string GenRan(List<string> dict)
{

    int r = Rand();
    string a = null;

    if (r == 1)
    {
        a += s[0];
        s.RemoveAt(0);
    }
    if (r == 2)
    {
        a += s[1];
        s.RemoveAt(1);
    }
    return a;
}

しかし、その後、Index is out of range エラーが発生します (理由は不明です)。

誰でも助けることができますか?

4

2 に答える 2

9

静的フィールド変数としてクラスに追加する必要があります。

private static List<string> s = new List<string> { "a", "b" };

static string GenRan()
{
    int r = Rand();
    string a = null;

    if (r == 1)
    {
        a += s[0];
        s.RemoveAt(0);
    }
    if (r == 2)
    {
        a += s[1];
        s.RemoveAt(1);
    }
    return a;
}
于 2012-12-01T21:21:17.623 に答える
1

しかし、もちろん関数を呼び出すたびにリストがリセットされるので、静的関数の外からリストにアクセスしたいと思います。

何を意味するのかははっきりしていませんが、呼び出し間でリストを永続化したい場合は、メソッドの外側で静的変数として宣言する必要があります。

private static readonly List<string> s = new List<string> {"a", "b"};

これで、どのメソッドからでもリストにアクセスできるようになりました。これは、基本的にクラスの状態の一部です。ただし、このアプローチには多くの注意事項があります。

  • List<T>はスレッドセーフではなく、通常、静的メソッドはスレッドセーフである必要があります。C# を初めて使用し、複数のスレッドを使用していない場合は、今のところ無視してかまいません。
  • 変数の名前を実際に変更する必要があります-sリストが何を表すのかを示すものはありません。
  • 一般に、グローバルな可変状態は悪い考えです。コードをテストしたり、それについて推論したりするのが難しくなります。繰り返しになりますが、C# を初めて使用し、実験を行っているだけの場合は、これについて心配する必要はないかもしれませんが、先に進むにつれて、静的変数だけでなく、より多くの変更可能な状態をオブジェクトに配置するようにしてください。
于 2012-12-01T21:21:25.580 に答える