C#如何只初始化本地变量一次

6
我想我的问题可能很蠢,但我必须知道答案。
在这种情况下,是否有可能只初始化一次变量?
    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

抱歉,我现在还不能翻译中文。

1
在当前形式下,该方法总是会使 dots = "." - scottm
3
在这个例子中,我认为使用StringBuilder不太划算。 - Inisheer
1
@MikeC. 因为它只执行一次字符串连接,而且不在循环中。 - Servy
@MikeC. - 看看这里https://dev59.com/B3I-5IYBdhLWcg3wf4dD(特别是第二个答案)。那个答案的措辞比我好得多。 - Inisheer
@JTA http://www.youtube.com/watch?v=e9mf3Bypyk8 - Mike Cole
显示剩余2条评论
5个回答

4

您说您不想在方法的类外保留圆点,那么您必须从方法中返回值,这样您至少可以在以后传递它,从而保存其状态。

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。

对你的问题的答案是

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

很抱歉,不行!


1
我同意这里的想法很聪明,但这是一个糟糕的解决方案。它失去了类成员路线的灵活性,因为只有在您保留原始字符串的引用时,字符串的附加才能起作用。而且它很难阅读或维护。 - Tim Copenhaver
我也曾经有同样的问题,但是在阅读了这个线程后,我意识到这是一个理想的使用场景,可以通过类的静态构造函数初始化只读静态成员来实现。 - David A. Gray

3

您可以在类中保留dots,并在创建类时进行初始化,例如:

string dots = string.Empty; 
private void Method()
{
    if (dots != "...")
        dots += ".";
    else
        dots = string.Empty;
}

1
为什么要将点的范围扩大到不需要方法的地方?而且这根本无法避免双重初始化。 - Eric J.
2
作为一个小的风格提示,我建议交换if和else。如果避免使用否定的if语句,那么阅读起来会更容易。 - Tim Copenhaver
3
@Eric应该是因为这个变量显然需要在方法之外使用。该方法不返回任何内容,因此唯一的获取结果的方式就是从外部获取。此外,你需要让该变量的作用域超出方法的范围,以便能够增加点数。 - Tim Copenhaver

2
在其他编程语言(比如 C++)中,你可以在任何作用域内声明静态变量。这样会很好地解决你的问题,但是在 C# 中不允许在函数内声明静态变量。实际上,这是一个常见的 C# FAQ: C# 为什么不支持静态方法变量?
这个设计特性意味着你不能用传统方法来实现你想要的功能。如果你不想干扰现有程序结构,你可能能够使用柯里化的特殊技巧来实现,但这并不是一个好主意。我相信有一种编写本地代码的方法可以满足你的需求,但这感觉就像是一个坏主意。
简单说,你正在请求在其作用域之外持久存在的数据。在 C# 中,你唯一的解决方案是扩大该数据的作用域。

1

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

考虑阅读这篇Stackoverflow帖子。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接