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;
}

但后来我得到一个索引超出范围错误(不知道为什么)。

任何人都可以帮忙吗?

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 回答