你有什么理由可以';t在C#方法中声明一个静态变量

本文关键字:声明 方法 变量 静态 一个 理由 什么 | 更新日期: 2023-09-27 18:25:46

在过去的几年里,我一直在使用C语言,我已经习惯了将单一用途的static变量放在代码中使用它们的位置附近。

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

谷歌搜索已经证实这在C#中是不可能的。尽管如此,我还是很好奇为什么代码(如以下代码)是完全禁止使用的。

public int incrementCounterAndReturn()
{
    static int i = 0;
    return ++i;
}

诚然,这是一个简单的例子,可以为同样的影响重新定义,但这与重点无关。方法范围,静态值有它们的位置和用途。哪些设计决策阻止了C#中静态对象的实现?

我们使用的是C#版本5.0,现在是2013。我只能假设这是不可能的,因为设计的选择,而不仅仅是因为"这是一件复杂而难以实现的事情"。有人知道任何内幕信息吗?

你有什么理由可以';t在C#方法中声明一个静态变量

语言设计团队不需要提供不实现功能的理由。相反,想要该功能的人需要证明该功能是设计、实施、测试和教育团队花费预算的最佳方式。从未有人为您提出的功能成功做到这一点。

如果我还在设计团队,并且有这个功能,我会指出这是完全没有必要的。C中的特性是引起开发人员困惑的一个已知原因,尤其是对于新手来说,并且局部与类型范围的好处很小。

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

这纯粹是一个设计选择。编译到同一IL的VB.Net确实允许通过Function或Sub语句中的Shared关键字实现这一点(尽管它是通过编译器将变量"提升"为类级静态变量来处理的)。

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

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

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

值得注意的是:这类操作使得正确地对该方法进行单元测试变得非常困难。通常在C#中,我们会使一个普通类保持这样的状态;事实上,这正是yield return在幕后的工作方式。

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