在VB6中,有一些本地静态变量在程序退出后保留它们的值。这就像使用公共变量但在本地块上。例如:
sub count()
static x as integer
x = x + 1
end sub
在10次调用之后,x将是10.我试图在.NET(甚至Java)中搜索相同的东西,但没有。为什么?它是否以某种方式打破了OOP模型,并且有一种方法可以模仿它。
答案 0 :(得分:6)
您可以获得的最接近的是静态字段 outside 方法:
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();
}
}
答案 1 :(得分:0)
为此,您始终可以在类中使用静态变量:
class C
{
static int x=0;
void count()
{
++x; // this x gets incremented as you want
}
}
答案 2 :(得分:0)
我记得在visual basic中的静态私有。对于某些特定任务来说,它们很酷。
.net中没有这样的东西。你必须坚持使用metod之外的静态。
答案 3 :(得分:0)
这些变量通常用于维护迭代器。 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#中的静态变量一样有效的是在迭代器实现期间,并且该值不会超出该范围。
我希望这对你有用。