在VB6中,有一些局部静态变量在过程退出后保留其值。这就像使用公共变量,但在当地块。例如:在C#中的VB6的私有静态?
sub count()
static x as integer
x = x + 1
end sub
10次调用后,x将是10.我试图在.NET(甚至Java)中搜索相同的东西,但没有。为什么?它是否以某种方式破坏了OOP模型,并且有一种方法来模拟它。
在VB6中,有一些局部静态变量在过程退出后保留其值。这就像使用公共变量,但在当地块。例如:在C#中的VB6的私有静态?
sub count()
static x as integer
x = x + 1
end sub
10次调用后,x将是10.我试图在.NET(甚至Java)中搜索相同的东西,但没有。为什么?它是否以某种方式破坏了OOP模型,并且有一种方法来模拟它。
你可以得到的最接近的是一个静态字段外方法:
private static int x;
public [static] void Foo() {
x++;
}
闭合例子的要求:
using System;
class Program {
private static readonly Action incrementCount;
private static readonly Func<int> getCount;
static Program() {
int x = 0;
incrementCount =() => x++;
getCount =() => x;
}
public void Foo() {
incrementCount();
incrementCount();
Console.WriteLine(getCount());
}
static void Main() {
// show it working from an instance
new Program().Foo();
}
}
您可以随时使用静态变量的类为此目的:
class C
{
static int x=0;
void count()
{
++x; // this x gets incremented as you want
}
}
我记得在visual basic中的静态私有。他们对于某些特定的任务很酷。
.net中没有这样的东西。你将不得不坚持外面的静态。
VB6确实有一些很酷的东西。 – blez 2010-05-01 00:27:43
那么,它们在VB.NET(尽管不是C#)中是可用的...如果你在一个方法中声明Static As As Integer,它的行为将类似于VB6。 – 2010-05-03 07:41:21
通常这些类型的变量用于维护迭代器。 C#通过yield
关键字直接将这些内置到语言中。这里有一个例子:
IEnumerable<int> TimesTable(int table)
{
for (int i=0 ; i<12 ; i++)
{
yield return i * table;
}
}
在这个例子中,我们创建n次表中的值,其中n由调用者指定。我们可以在任何地方使用这个迭代器使用,如在foreach
循环:
foreach (var value in TimesTable(3))
{
Console.Write(""+ value + " ");
}
...主要生产:
3 6 9 12 15 18 21 24 27 30 33 36
在C++中,这可能使用的都是静态的变量,比如那些你从VB描述(我不是一个VB的家伙,所以我不知道VB语法):
int TimesTable(int table) {
static i = 1;
if (i == 12) {
i = 1;
}
return i++ * table;
}
C#的版本是比C++更好(或VB),相当于监守迭代器可以取消耳而且在任何给定的时间可以有多个迭代器活动。如果没有开发人员的更多工作,这些事情就不适用于C++版本。不利的一面是,这意味着C#中唯一一次类似静态变量的事情在迭代器实现期间是有效的,并且该值不会超出该范围。
我希望这对你有一些用处。
是的,我意识到迭代器,但这不是我需要的具体事情,无论如何,谢谢。 – blez 2010-05-01 00:29:05
使用静态构造函数用闭包初始化委托字段在访问变量方面可能稍微接近(与静态字段不同,它不会通过类中的反射或其他类方法可见) – 2010-04-30 22:30:10
@Ben - 有趣的方法,但很多额外的复杂性 - 让人们了解捕获的变量在最好的时候是棘手的; -p – 2010-04-30 22:35:22
好吧,我明白了,但*为什么*?它是否以某种方式破坏了OOP? – blez 2010-05-01 00:30:00