VB6中的私有静态在C#中?

时间:2010-04-30 22:23:46

标签: c# java .net vb6

在VB6中,有一些本地静态变量在程序退出后保留它们的值。这就像使用公共变量但在本地块上。例如:

sub count()
static x as integer
x = x + 1
end sub

在10次调用之后,x将是10.我试图在.NET(甚至Java)中搜索相同的东西,但没有。为什么?它是否以某种方式打破了OOP模型,并且有一种方法可以模仿它。

4 个答案:

答案 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#中的静态变量一样有效的是在迭代器实现期间,并且该值不会超出该范围。

我希望这对你有用。