为什么我的未初始化变量在TryParse中设置了值后又会再次取消赋值?

如何解决为什么我的未初始化变量在TryParse中设置了值后又会再次取消赋值?

变量inputBool在while循环外声明,然后在我尝试将userInput解析为布尔值时在while循环内设置。但是,一旦退出while循环,inputBool便会再次变为未声明!

但是,如果我使用一个值(例如,EG false)初始化inputBool变量,它将在while循环内设置,然后保持设置为TryParse内部分配的任何值,即使在退出while循环之后。 / p>

这是我想要的行为,但是当我不立即初始化变量时为什么不起作用?

        foreach (string question in questions)
        {
            bool isBool = false;
            // inputBool declared here.
            bool inputBool;
            string userInput;

            while (!isBool)
            {
                Console.WriteLine(question);
                userInput = Console.ReadLine();

                // inputBool gets assigned a value here in the TryParse.
                isBool = Boolean.TryParse(userInput,out inputBool);
                if (!isBool) Console.WriteLine("Please respond with 'true' or 'false'.");
            }

            // inputBool is unassigned here!
            answers[askingIndex] = inputBool;
            askingIndex++;
        }

解决方法

C#语言定值分析仅使用程序结构,而不使用数据值。

一个密切相关的问题:

bool b = f();
int x;
// (1)
if (b) {
    x = 42;
    // (2)
    Trace.WriteLine(x); // ok
}
// (3)
if (b) {
    // (4)
    Console.WriteLine(x); // error,use of potentially unassigned variable x
}

很显然,在(1)中,x可能未被分配(肯定是偶数)。在(2)处,x被明确分配。在(3)中,当且仅当b为true时,才分配x…但是编译器不会尝试跟踪此情况。它只是说“可能未分配”。结果是,在(4)处,即使您和我都可以,编译器也无法证明x已明确分配。

当编译器遇到while循环时,可以跳过循环。因此,在循环之前可能未分配的所有内容在循环之后仍可能未分配的任何内容。即使您和我可以证明您的循环仅在分配了变量后才终止,这取决于数据值,而不是结构,并且C#不考虑它。

您可以通过制作代码流程图轻松地重新创建编译器的定值分析。在两条路径结合的任意点,将布尔AND应用于变量的状态。

,

从流分析的角度来看,不能保证while循环将至少执行一次。当然,您会另外知道,因为您的条件涉及一个bool变量,该变量已初始化为false的值,但是编译器不够聪明,无法实现。

因此,如果它至少执行不到一次,inputBool仍将在末尾统一化,因此会出错。

您需要确保在所有代码路径中初始化变量。有两种可能的修复方法:

  1. while更改为do...while。确保至少执行一次,以确保变量被初始化。
  2. 将变量初始化为合理的默认值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?