过去几年我一直在使用C语言,并且我已经设法将单用途static
变量放在我的代码中使用它们附近的位置。
在编写一个需要方法范围静态值的非常基本的方法时,我有点惊讶地发现编译器不喜欢我试图从我的方法中定义静态对象。
谷歌搜索已经证实在C#中这是不可能的。不过,我很好奇为什么代码,如下所示,完全没有限制。
public int incrementCounterAndReturn()
{
static int i = 0;
return ++i;
}
当然,这是一个简单的例子,可以为同样的影响重新定义,但这不是重点。方法范围,静态值有它们的位置和目的。哪些设计决策阻止了C#中静态对象的实现?
我们使用的是C#5.0版本,它是2013年。我只能假设这是不可能的,因为设计选择并不仅仅因为“这是一个复杂而难以实现的东西”。有没有人有任何内幕消息?
答案 0 :(得分:9)
语言设计团队无需提供不实施功能的理由。相反,需要该功能的人需要证明该功能是设计,实施,测试和教育团队可以花费预算的最佳方式。没有人为你提出的功能成功地做过这样的事情。
如果我还在设计团队中并且有这个功能,我会指出它完全没必要。 C中的功能是开发人员混淆的一个已知原因,特别是对于初学者而言,本地与类型范围的好处很小。
答案 1 :(得分:3)
底层运行时不提供方法级静态变量。在CLR中,所有“静态”数据都是在类型级别定义的,而不是在方法级别定义的。 C#决定不在语言设计的语言层面添加它。
这纯粹是一种设计选择。编译为相同IL的VB.Net允许通过the Shared keyword in a Function or Sub statement进行此操作(尽管它是通过编译器“将”变量“提升”为类级静态变量来处理的。)
答案 2 :(得分:1)
static
变量的范围限定在类中,而不是对象实例。要使这项工作,您的方法必须声明为static
,并且我相信您的类也必须是static
(因为实例化不相关)。
但是变量本身必须在类级别声明。 C#不允许您创建方法本地静态变量。
值得注意的是:这些类型的操作使得对方法进行适当的单元测试非常困难。通常在C#中,一个普通的类可以保持这种状态;事实上,that's exactly how yield
return
works幕后。
答案 3 :(得分:1)
因为在CLR中,静态变量与 TYPE 相关联。它们的存储与它们所关联的Type(类或stuct)相关联。
答案 4 :(得分:1)
.NET框架和语言是围绕这样一个概念设计的,任何准备编译程序集的人都应该被认为足够可信,可以访问其中的所有代码。从语义的角度来看,在方法foo
中声明静态变量bar
等同于在方法外声明私有静态变量并在方法中访问它,前提是只选择一个名称作为名称在其他地方没有使用的东西。如果按惯例组合方法名称和含义(例如bar_foo
),通常可以很容易地避免命名冲突。由于语义等同于在方法外声明变量,因此不需要在内部声明它。