从静态函数访问外部变量

时间:2012-12-01 21:19:09

标签: c# string static void output

我有一个静态功能:

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

然后我得到一个索引超出范围错误(不确定原因)。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:9)

您需要将其作为static field变量添加到类中:

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

答案 1 :(得分:1)

  

但每次我调用函数时,列表都会重置,所以我想从静态函数外部访问列表。

你的意思并不是很清楚,但如果你的意思是你希望列表在调用之间保持持久,你需要在方法之外将它声明为一个静态变量:

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

现在您可以从任何方法访问列表,它基本上是类的状态的一部分。但是,这种方法附带 lot 的警告:

  • List<T>不是线程安全的,通常静态方法应该是线程安全的。如果您刚刚接触C#并且没有使用多个线程,那么您现在可以忽略它。
  • 您应该真正重命名变量 - s不会指示列表的含义。
  • 一般来说,全局可变状态是一个坏主意。它使您很难测试代码并对其进行推理。同样,如果你是C#的新手并且只是试验,你可能不需要担心这一点,但是当你继续前进时,你应该尝试在对象中放置更多可变状态,而不仅仅是静态变量。