我一直在编写一个程序,从微控制器获取数据并使用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());
}
答案 0 :(得分:1)
值将被取消分配...但我在开关声明中表达了意义!?!?
不,你没有。如果number
大于4,该怎么办? default
案例似乎没有初始化您的变量。
通过switch
语句的所有可能方式必须初始化变量。只要有一种方法可以在不初始化的情况下通过,编译器会认为它们可能未初始化。
答案 1 :(得分:0)
default:
values = null;
filepath = null;
break;
你是什么意思,什么值会有值和文件路径是不是1,2,3或4?每个人都必须先进行初始化。
答案 2 :(得分:0)
答案:
正如辉煌的@jmcilhinney所提到的,我的默认陈述是空的;虽然您可能确定您的switch语句包含所有可能的答案,但编译器不会做出假设。默认情况下还需要对变量执行某些操作,以便编译器“快乐”。这是@jmcilhinney评论:
除非您在默认情况下分配值,否则可以在不分配值的情况下到达开关块的末尾,从而导致编译错误。一个变量必须保证有一个值,而不是假设。 - jmcilhinney