【问题标题】:Unreachable code detected C# (absolute beginner) [closed]检测到无法访问的代码 C#(绝对初学者)[关闭]
【发布时间】:2014-01-13 14:07:28
【问题描述】:

您能否解释一下我应该如何避免在 Visual Studio 2010 Express 中出现此警告:“检测到无法访问的代码”?我正在从手册中学习 C#。 这是一个创建简单方法的练习。我输入的例子正是书中所写的。谢谢。

public class Multiply 
{
    //Multiplies argument by 4 

    public static int MultiplyBy4(int aNumber)
    {
        return 4 * aNumber;
        //Shows ways of passing various arguments to a method public static void Main
        int x = 7;
        int y = 20;
        int z = -3;
        int result = 0;

        result = MultiplyBy4(x);
        Console.WriteLine("Passsing a variable, x : {0}", result);

        result = MultiplyBy4(y + 2);
        Console.WriteLine("Passing an expression, Y + 2: {0}", result);

        result = 5 + MultiplyBy4(z);
        Console.WriteLine("Using MultiplyBy4 in an expression: {0}", result);
        Console.ReadLine();
    }
 }

我看不懂手册评论: 在创建带有参数和返回值的方法后,“显示将各种参数传递给方法 public static void Main 的方法”。 如何使 MultiplyBy4 方法将 x、y、z 识别为“aNumber”? 也许这是一个智障问题,但我被困在这里。 谢谢。

【问题讨论】:

  • 看起来他们希望您注释掉各个部分,一次一个,然后依次尝试(不是一次全部)。 return 4 * aNumber 语句结束该方法,因此以下代码永远不会运行。首先将其注释掉。
  • 我认为您需要另一本手册。这是一个可怕的例子。
  • 我尝试注释掉,它没有做任何事情。我同意这太可怕了。直到这里一切顺利。现在天黑了。
  • 我通过编写如下 Carsten Heine 所示的示例解决了警告。现在看来没那么糟糕了。

标签: c# unreachable-code


【解决方案1】:

注释行乱七八糟,包含 Main 方法的定义。代码应为:

    public class Multiply 
{
        //Multiplies argument by 4 
        public static int MultiplyBy4(int aNumber)
        {
            return 4 * aNumber;
        }

        //Shows ways of passing various arguments to a method
        public static void Main(string[] args)
        {
                int x = 7;
                int y = 20;
                int z = -3;
                int result = 0;

                result = MultiplyBy4(x);
                Console.WriteLine("Passsing a variable, x : {0}", result);

                result = MultiplyBy4(y + 2);
                Console.WriteLine("Passing an expression, Y + 2: {0}", result);

                result = 5 + MultiplyBy4(z);
                Console.WriteLine("Using MultiplyBy4 in an expression: {0}", result);
                Console.ReadLine();
            }
 }

【讨论】:

  • 很好,但这使问题离题了。
  • 我按照你说的写了下来,但现在我有 4 个红色错误。我想朝自己的脑袋开枪。
  • 你是对的。这就是方法的工作原理,我现在明白了。我打开了一个新项目并从头开始编写所有内容。似乎我有太多或太少的 {{{}} 的问题。控制台一次显示所有结果。谢谢。
【解决方案2】:

return 语句在这里退出函数。

所以 x,y,z 和 result 的声明以及 Console.Write 永远不会运行...

【讨论】:

  • 好的,我该如何修复它并让它工作?如果我删除返回,我没有方法。知道警告的原因并不能给我解决方案,因为我的知识在这一点上非常有限。
  • 如果我理解你的练习,返回后面的所有内容都应该在 Main(或至少在你程序的 main 函数中)恕我直言。
  • 我把所有东西都放在了 Main 中,它都变红了。我认为这需要 6 个月的时间才能彻底解决。我正在前进。我将采用无方法的编程风格。
  • 你是对的。我在使用大括号时遇到了一些麻烦(我在本章中迷路了)。我开始了一个新项目,它奏效了。谢谢。
【解决方案3】:

这是因为代码无法运行函数的每一行,因为您在函数中的某些代码之前退出函数:

   public class Multiply 
  {
//Multiplies argument by 4 

           public static int MultiplyBy4(int aNumber)
            {
                return 4 * aNumber; // <---- You exit the function MultiplyBy4 here

               // Everything beneath this line will never get executed
               // --------------------------------------

//Shows ways of passing various arguments to a method public static void Main
                int x = 7;
                int y = 20;
                int z = -3;
                int result = 0;

                result = MultiplyBy4(x);
                Console.WriteLine("Passsing a variable, x : {0}", result);

                result = MultiplyBy4(y + 2);
                Console.WriteLine("Passing an expression, Y + 2: {0}", result);

                result = 5 + MultiplyBy4(z);
                Console.WriteLine("Using MultiplyBy4 in an expression: {0}", result);
                Console.ReadLine();
            }
 }

这是编译器检测并警告您的内容,因为在大多数情况下这是一个编码错误。

如果您移动 return 语句并在函数末尾退出函数,您的代码也会导致 StackOverflow(我们在 SO 上的做法多么讽刺:P)。您通过调用 MultiplyBy4(z);

导致了永无止境的递归

这将导致处理器以 100% 的速度运行并填满完全保存函数调用的内存部分。

【讨论】:

    【解决方案4】:

    正如 cubitouch 所说,return 语句在函数中停止执行。

    如果您在 if 子句中有多个 return 语句,则可以有多个。但至少有一个 return 语句必须在可以从任何地方到达的函数中(例如,不满足任何条件)

    通常返回语句是函数中的最后一条指令。

    【讨论】:

      【解决方案5】:

      return 语句之后的任何语句都无法访问。它永远不会被执行,编译器会通知你。

      如果由于无法访问而无法执行语句,则会发出编译时警告

      Unreachable Statements MSDN

      【讨论】:

      • 不是编译时错误,而是编译时警告。尽管我个人总是将警告视为错误,但并非所有人都会这样做。
      • 这是编译时的警告,而不是错误。
      • 无论如何都不会执行任何操作。这是我到目前为止所学到的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2012-02-10
      • 2011-05-09
      相关资源
      最近更新 更多