有没有理由不能在C#方法中声明静态变量?

Is there reason why you can't declare a static variable within a C# method?

过去几年我一直在C语言中工作,并且我设法习惯将单用途的static变量放在我代码中使用它们的位置附近。

当编写一个非常基本的方法,需要一个方法范围的静态值时,我有点惊讶地发现编译器不喜欢我试图从我的方法中定义一个静态对象。

谷歌已经证实这在C内是不可能的。不过,我很好奇为什么代码,像下面这样,是完全禁止的。

1
2
3
4
5
public int incrementCounterAndReturn()
{
    static int i = 0;
    return ++i;
}

当然,这是一个简单化的例子,可以为同样的影响重新定义,但这并不重要。方法范围、静态值都有它们的位置和用途。哪些设计决策阻止了C_内静态对象的实现?

我们的版本是5.0,现在是2013年。我只能假设这是不可能的,因为设计选择,而不仅仅是因为"这是复杂和难以实现的东西。"有人有任何内幕信息吗?


语言设计团队不需要提供不实现功能的原因。相反,需要这个特性的人来证明这个特性是设计、实现、测试和教育团队花费预算的最佳可能方式。没有人能成功地为您所建议的功能做到这一点。

如果我仍然是设计团队的成员,并且有了这个特性,我会指出这是完全不必要的。C中的特性是造成开发人员混乱的一个已知原因,特别是对于新手来说,本地vs类型范围的好处很小。


基础运行时不提供方法级静态变量。在CLR中,所有"静态"数据都是在类型级别上定义的,而不是方法级别。C决定不在其语言设计中的语言级别添加这一点。

这纯粹是一种设计选择。vb.net编译到同一个il,它允许通过函数或子语句中的shared关键字来实现这一点(尽管它是通过编译器"提升"变量为类级静态变量来处理的)。


NET框架和语言是围绕这样一个概念设计的:任何将要编译程序集的人都应该被认为是值得信赖的,足以访问其中的所有代码。从语义的角度来看,在方法bar中声明静态变量foo相当于在方法外部声明一个私有静态变量,并在方法内部访问它,前提是只选择一个在其他地方不使用的名称作为名称。如果按约定将方法名和含义(如bar_foo结合起来),通常可以很容易地避免命名冲突。由于语义相当于在方法外部声明变量,因此不需要在方法内部声明变量。


因为在CLR中,静态变量与类型关联。它们的存储与它们关联的类型(类或stuct)相关联。


static变量的作用域是类,而不是对象实例。要实现这一点,您的方法必须声明为static,我相信您的类也必须是static(因为实例化不相关)。

但是变量本身必须在类级别声明。C不允许创建方法局部静态变量。

值得注意的是:这种操作使得单元测试方法非常困难。一般情况下,在C中,人们会让普通的阶级持有这种状态;事实上,这正是yieldreturn在幕后工作的方式。