5

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

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

谷歌搜索已验证这在 C# 中是不可能的。不过,我很好奇为什么像下面这样的代码完全不受限制。

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

当然,这是一个简单的示例,可以针对相同的影响重新定义,但这不是重点。方法范围,静态值有它​​们的位置和目的。哪些设计决策阻止了在 C# 中实现这样的静态对象?

我们使用的是 C# 版本 5.0,现在是 2013 年。我只能假设这是不可能的,因为设计选择,而不仅仅是因为“这是复杂且难以实现的东西”。有人知道内幕消息吗?

4

5 回答 5

9

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

如果我还在设计团队中并且有这个功能,我会指出这是完全没有必要的。C 中的特性是开发人员混淆的一个已知原因,特别是对于新手来说,本地与类型范围的好处是微乎其微的。

于 2013-07-31T18:17:12.200 回答
3

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

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

于 2013-07-31T17:51:30.137 回答
1

static变量的作用域是类,而不是对象实例。为了使这项工作,你的方法必须被声明static,我相信你的类也必须是static(因为实例化不相关)。

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

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

于 2013-07-31T17:51:23.920 回答
1

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

于 2013-07-31T17:52:01.297 回答
1

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

于 2013-08-02T22:39:37.760 回答