【问题标题】:Local Static variable in C#?C#中的局部静态变量?
【发布时间】:2014-07-15 14:11:21
【问题描述】:

受 JavaScript 闭包的启发,我尝试使用 Func Delegate 在 C# 中模拟局部静态变量... 这是我的代码..

public Func<int> Increment()
    {
        int num = 0;
        return new Func<int>(() =>
        {
            return ++num;
        });
    }

Func<int> inc = Increment();
Console.WriteLine(inc());//Prints 1
Console.WriteLine(inc());//Prints 2
Console.WriteLine(inc());//Prints 3

我很想知道在 C# 中是否有任何其他方法可以模拟局部静态变量? 谢谢。

【问题讨论】:

  • 创建静态变量的 C# 方法实际上是创建一个具有 static 成员的类。这感觉就像你在问“我怎样才能让 C# 表现得像 Javascript?”我认为答案应该是“不要”。它们是两种不同的语言,强迫一种语言表现得像另一种语言只会以泪水告终。
  • @Uthaiah 在什么方面表现得像 static 变量? static 变量属于 class,this 属于实例。这绝对等同于 static 变量。
  • 对,但他正在尝试模拟 函数范围的静态变量,就像你在 C++ 中找到的那样 - function() { static int = 0; .. }
  • 好吧,我真的明白现在要问什么了。对于其他感到困惑的人,请参阅stackoverflow.com/questions/1049689/… 和 AlfredBr 的回答
  • 我不会认为这是另一个问题的重复,它要求不同的东西并且可能的答案也不同。

标签: c# javascript .net


【解决方案1】:

这绝对是可怕的,但一种方法是使用迭代器方法并丢弃输出。例如,如果你想:

public void PrintNextNumber()
{
    static int i = 0; //Can't do this in C#
    Console.Out.WriteLine(i++);
}

你可以改为:

public IEnumerator<object> PrintNextNumber()
{
    int i = 0;
    while (true)
    {
        Console.Out.WriteLine(i++);
        yield return null;
    }
}

那么,您可以调用var printNext = PrintNextNumber(); printNext.MoveNext;,而不是调用PrintNextNumber()

我真的只是为了满足好奇心才写这个答案,我绝对不会建议真的这样做!

如果你想从方法中实际返回一些东西,那就更糟糕了,但这是可能的——你可以用yield return 代替,然后在调用MoveNext 后使用Current 检索它

【讨论】:

  • 这不等于staticPrintNextNumber().MoveNext总是打印出0,因为每次调用PrintNextNumber 时都会创建一个新的枚举器。实际获得所需行为的唯一方法是将枚举数存储在静态变量中,以便公共方法可以返回它或获取它的下一个值,这当然不符合没有静态字段的要求。
  • 不错的@BenAaronson :)
  • @Servy 没有静态字段的目的不是因为 OP 厌恶 static 关键字,而是避免将变量暴露在更大的范围内in. 所以有一个引用该方法的静态成员字段不会有同样的问题。
猜你喜欢
  • 1970-01-01
  • 2016-04-24
  • 2015-10-04
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多