5

我认为我的问题将是完全愚蠢的,但我必须知道答案。

在这种情况下是否可以只初始化一次变量?

    static void Main()
    {
        while (true)
        {
            MethodA();
            MethodB();
        }
    }

    private static void MethodA()
    {
        string dots = string.Empty;    // This should be done only once

        if (dots != "...")
            dots += ".";
        else
            dots = string.Empty;

        Console.WriteLine(dots + "\t" + "Method A");
        System.Threading.Thread.Sleep(500);
    }

    private static void MethodB()
    {
        string dots = string.Empty;    // This should be done only once

        if (dots != ".....")
            dots += ". ";
        else
            dots = string.Empty;

        Console.WriteLine(dots + "\t" + "Method B");
        System.Threading.Thread.Sleep(500);
    }

当然,我可以用方法初始化字符串点,但我不想在代码中弄乱,这也不能在任何其他循环中完成(比如 for)。有什么想法可以解决这个问题,还是我很愚蠢,无法正常思考?

提前致谢。

编辑:我已将示例代码更改为更实用。期望的输出应该是:

.    Method A
.    Method B
..   Method A
..   Method B
...  Method A
...  Method B
     Method A
.... Method B
.    Method A
.....Method B

等等等等。

4

5 回答 5

3

您可以保留dots在您的班级中,并在创建班级时对其进行初始化,即

string dots = string.Empty; 
private void Method()
{
    if (dots != "...")
        dots += ".";
    else
        dots = string.Empty;
}
于 2012-07-20T16:09:38.127 回答
3

您说您不想将点保留在 Method 之外(在 Method 的类中),那么您必须从 Method 返回值,以便您至少可以稍后将其传递,从而保持其状态。

string Method(string dot = string.Empty)
{
   if(dot == "...") return string.Empty;
   else return dot + ".";
}

var result = Method(Method(Method(Method(Method(Method()))))) // etc...

编辑:您编辑的问题不会使您的初始问题更实用。它仍然存在同样的问题:您想要 X,但 C# 没有 X。请改用 C++ 或 VB.NET。

你的问题的答案

“在这种情况下是否可以只初始化一次变量?”

抱歉,不!

于 2012-07-20T16:22:14.990 回答
2

在其他语言 (C++) 中,您可以在任何范围内声明静态变量。这将巧妙地解决您的问题,但 C# 不允许在函数中声明静态变量。这实际上是一个 C# FAQ:为什么 C# 不支持静态方法变量?.

这种设计特点意味着您无法以传统方法做您想做的事。你也许可以用柯里化做一些特别狡猾的事情,但如果你不想弄乱现有的程序结构,那就不行了。我敢肯定,有一种方法可以编写本机代码,让你得到你想要的,但这感觉是个坏主意。

简而言之,您要求的是在其范围之外持续存在的数据。在 C# 中,您的主要(唯一?)补救措施是增加该数据的范围。

于 2012-07-20T16:33:36.287 回答
1

您正在寻找方法调用之间的持久数据,因此您需要调用之外的数据元素。C# 中没有静态局部变量。

考虑阅读这篇 Stackoverflow 帖子。

于 2012-07-20T16:10:58.153 回答
0

您是否在考虑C++ 中的静态局部变量?C# 不支持它们,如此所述。

于 2012-07-20T16:27:58.510 回答