静态作为C#中函数内部的局部变量

时间:2019-03-05 02:23:11

标签: c#

我知道了,

来自MSDN

  

C#不支持静态局部变量(在方法范围内声明的变量)。

还有here

  

静态修饰符可以与类,字段,方法,属性,运算符,事件和构造函数一起使用,但不能与索引器,析构函数或类以外的类型一起使用。

也就是说,方法内部不允许将局部变量作为静态变量。

因此,以下代码将无法编译

public class Base1
{    
    public int getHighscoreString()
    {
        int highscore = Int32.MinValue;

        static int max = 10; // It is not allowed here.

        if(max>highscore)
            highscore = max;

        return highscore;

    }
}

但是,我们始终可以通过以下方式实现相同的功能

public class Base1
    {    
        static int max = 10; 
        public int getHighscoreString()
        {
            int highscore = Int32.MinValue;

            if(max>highscore)
                highscore = max;

            return highscore;

        }
    }

那么,是设计决定是否将静态变量不能用作方法内部的局部变量或其背后的任何原因?

1 个答案:

答案 0 :(得分:-1)

静态变量是一个变量,该变量生活在声明所在的类的实例之外,从某种意义上说,要获取或设置其值,您必须调用其类类型而不是其实例。发生这种情况是因为保留了对静态变量所在的内存地址的引用,而不管该类实例的构造或处置如何。假设您有一个Zoo班级:

public class Zoo
{
    public static int counter;
    public string Name;

    public void AddAnimal(string name)
    {
        Name = name;
        counter++;
    }
}

每次向动物园添加animal时计数器都会增加,您可以随时通过致电获取总数

Zoo myZoo = new Zoo()
myZoo.AddAnimal(“tiger”);
Zoo.counter; // 1
myZoo.counter // wrong!

除了myZoo.counter错误之外,主要要注意的是,即使我们处置了myZoo实例,counter字段也始终将动物总数保留在动物园!

相反,在方法执行后立即立即放置在方法中声明的变量,因此您不能在该方法之外引用它们,因为变量“居住”的内存地址不再可用。

我希望这可以进一步澄清问题。干杯!