使用switch语句时C#未分配的局部变量

时间:2018-04-24 05:02:43

标签: c# csv variables

我一直在编写一个程序,从微控制器获取数据并使用c#将其保存到csv文件中。在正确分配变量时,我遇到了一些问题,我已经达到了一个问题,我很困惑为什么我的代码不能在C#中编译,但在嵌入式c中执行类似的过程可以正常工作。 我在switch语句之前声明了我的字符串;并且在切换变量之后,我得到一个错误说"使用未分配的变量"。 我在switch语句中的一个case的直接副本的声明旁边放了一些注释,当我这样做时,函数运行;但它会使" S1_test"中的数据翻倍。 CSV;我认为这是由于文件位置的重复。即使是这种情况,它也会按照我的预期正常保存所有数据。 数据本身也会出现类似的问题;保存到" string []值;"变量。 当我没有分配这些变量时(例如:string filepath = null;)我没有得到任何错误,但数据没有保存,功能无法正常工作。 如何正确分配这两个变量?我似乎没有抓住C#以及我为控制器编写的嵌入式编程。 我遇到问题的功能如下:

    public void DatatoCSV(int sensor)
    {
        int number = sensor;
        string[] stringSeparator = new string[] { "," };

        /* this is where I am having troubles when i add the comments in the code will work but I get multiples in "S1_test.csv" file */
        string filepath; /*= @"C:\Users\GTProject\Documents\****\Temperature Characterisation\csv_test\S1_test.csv";*/
        string[] values;/*= sensor1Data.Split(stringSeparator, StringSplitOptions.None);*/

        var csv = new StringBuilder();

        // changes the variables required depending on what sensor data is being saved
        switch (number)
        {
            case 1:

                values = sensor1Data.Split(stringSeparator, StringSplitOptions.None);
                filepath = @"C:\Users\GTProject\Documents\****\Temperature Characterisation\csv_test\S1_test.csv";
                break;

            case 2:
                values = sensor2Data.Split(stringSeparator, StringSplitOptions.None);
                filepath = @"C:\Users\GTProject\Documents\****\Temperature Characterisation\csv_test\S2_test.csv";
                break;

            case 3:
                values = sensor3Data.Split(stringSeparator, StringSplitOptions.None);
                filepath = @"C:\Users\GTProject\Documents\****\Temperature Characterisation\csv_test\S3_test.csv";
                break;

            case 4:
                values = sensor4Data.Split(stringSeparator, StringSplitOptions.None);
                filepath = @"C:\Users\GTProject\Documents\****\Temperature Characterisation\csv_test\S4_test.csv";
                break;

            default:
                /*run some function*/
                break;
        }

        /* values will be unassigned... BUT I GAVE IT MEANING IN THE SWITCH STATEMENT!?!?  */
        // values to be saved 
        var sensor_number   = values[0];
        var sensor_reading  = values[1];
        var sensor_status   = values[2];
        var sensor_temp     = values[3];

        // sets up the string that is going to be saved to the csv
        var newline = string.Format("{0},{1},{2},{3}", sensor_number, sensor_reading, sensor_status, sensor_temp);


        // creates an appended line format of the string created above
        csv.AppendLine(newline);

        /* here it will say that 'filepath' is unassigned -WHY!? *INTERNAL RAGE* */
        // saves the string to the csv filepath
        File.AppendAllText(path: filepath, contents: csv.ToString());
    } 

3 个答案:

答案 0 :(得分:1)

  

值将被取消分配...但我在开关声明中表达了意义!?!?

不,你没有。如果number大于4,该怎么办? default案例似乎没有初始化您的变量。

通过switch语句的所有可能方式必须初始化变量。只要有一种方法可以在不初始化的情况下通过,编译器会认为它们可能未初始化。

答案 1 :(得分:0)

        default:
            values = null;
            filepath = null;
            break;

你是什么意思,什么值会有值和文件路径是不是1,2,3或4?每个人都必须先进行初始化。

答案 2 :(得分:0)

答案:

正如辉煌的@jmcilhinney所提到的,我的默认陈述是空的;虽然您可能确定您的switch语句包含所有可能的答案,但编译器不会做出假设。默认情况下还需要对变量执行某些操作,以便编译器“快乐”。这是@jmcilhinney评论:

除非您在默认情况下分配值,否则可以在不分配值的情况下到达开关块的末尾,从而导致编译错误。一个变量必须保证有一个值,而不是假设。 - jmcilhinney