【问题标题】:Unassigned variable and "Not all code paths return a value" workaround?未分配的变量和“并非所有代码路径都返回值”解决方法?
【发布时间】:2019-11-22 16:21:14
【问题描述】:
private static char GetGuess()
{ 
    char guess;
    bool guessInputSuccess = false;

    while (!guessInputSuccess)
    { 
        Console.Write("Guess your letter: ");

        char.TryParse(Console.ReadLine().ToLower(), out guess); 

        if (!char.IsLetter(guess))
        { 
            Console.Write("You have not entered a letter from a-z."); 
        }
        else
        { 
            guessInputSuccess = true; 
        } 
    }

    return guess; 
}

目前看来,我无法返回 guess,因为它尚未分配。我通常解决这个问题的方法是将guess 分配给一个随机字符。由于while 循环将一直持续到输入来自 a-z 的有效字符,所以可以确信在它返回时,来自 a-z 的字符将被分配给 guess。我个人不喜欢这种解决方法,因为对我来说,感觉很草率。

我的问题是:有什么方法可以让猜测在方法开始时初始化但未分配,并且在方法执行结束时仍然设置并正确返回?

【问题讨论】:

  • char 是一个值类型,所以它必须包含一个值。如果您不想使其成为char?,那么您可以使用char guess = default(char) 来减轻随机值的草率。
  • char.IsLetter 将返回 true 用于非 a-z 之间的字母,例如希腊字母 gamma、γ。如果您想将其限制为仅 a-z,则需要测试 guess >= 'a' && guess <= 'z'

标签: c# performance methods return-value


【解决方案1】:

只要输入正确的猜测就返回 - 并一直循环直到那时。你根本不需要guessInputSuccessguess 可以有更小的范围:

private static char GetGuess()
{ 
    while (true)
    { 
        Console.Write("Guess your letter: ");
        if (char.TryParse(Console.ReadLine().ToLower(), out char guess) && 
            char.IsLetter(guess))
        {
            return guess;
        }
        Console.Write("You have not entered a letter from a-z."); 
    }
}

【讨论】:

  • 糟糕的效率!
  • 为了稍微提高效率,如果char.TryParse()返回false,则无需执行if (char.IsLetter(guess))
  • @foamu - 我明白了;我只是说char.TryParse() 返回有用的信息,因此您可以改为使用if (char.TryParse(Console.ReadLine().ToLower(), out char guess) && char.IsLetter(guess)) { return guess; },如果输入的内容甚至不解析为字符,它将跳过测试输入的内容是否为字母。
【解决方案2】:

如果你使用do...while循环,编译器可以看到guess总是被赋值:

char guess;
bool guessInputSuccess = false;

do 
{ 
    Console.Write("Guess your letter: ");

    char.TryParse(Console.ReadLine().ToLower(), out guess); 

    if (!char.IsLetter(guess))
    { 
        Console.Write("You have not entered a letter from a-z."); 
    }
    else
    { 
        guessInputSuccess = true; 
    } 
} while (!guessInputSuccess);

return guess; 

或者,给guess 一个初始值。 知道它总是会被赋值,所以值是什么并不重要:

char guess = '\0';
bool guessInputSuccess = false;

while (!guessInputSuccess)
{ 
    Console.Write("Guess your letter: ");

    char.TryParse(Console.ReadLine().ToLower(), out guess); 

    if (!char.IsLetter(guess))
    { 
        Console.Write("You have not entered a letter from a-z."); 
    }
    else
    { 
        guessInputSuccess = true; 
    } 
}

return guess; 

【讨论】:

    【解决方案3】:

    如果我猜对了。您可以分配一个empty 字符代码,即'\0'

    guess='\0'

    【讨论】:

      猜你喜欢
      • 2016-03-18
      • 2011-12-17
      • 1970-01-01
      • 2021-06-08
      • 2018-12-28
      • 1970-01-01
      • 2021-05-04
      相关资源
      最近更新 更多