c#局部变量

本文关键字:局部变量 | 更新日期: 2023-09-27 18:01:40

谁能解释一下为什么我得到:

"使用未赋值的局部变量number_of_column" for: if (i

最好的处理方法是什么?

static void Main(string[] args)
{ 
    int number_of_column;
    if (Directory.Exists(path))
    {
        var file = dir.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
        string file1 = file.ToString();
        Console.WriteLine(file1);
        StreamReader sr = new StreamReader(path + "''" + file1);
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (start == true)
            {
                string[] line1 = line.Split(',');
                number_of_column = line1.Count();
                i = 0;
                foreach (string s in line1)
                {
                    if ((s != "0") || (!string.IsNullOrEmpty(s)))
                    {
                        col[i] = "checked";
                    }
                    i++;
                }
            }
            else
            {
                if (line.Contains("Timestamp") && line.Contains("LiveStandby") && line.Contains("peak"))
                {
                    start = true;
                }
            }
        }
        sr.Close();
        i=0;
        foreach (string s in col)
        {
            if (i < number_of_column -1)
            {

c#局部变量

如果从未进入while循环,则该变量没有赋值。

如果在If中执行else分支,则该变量没有赋值。

这些是你得到这个错误消息的原因。

可以通过在声明变量时赋值来解决这个问题。

c#要求在使用局部变量之前初始化它们。对于成员变量,这是不必要的,它们会自动获得默认值。

完全细化了你的代码

  1. file然后file1是冗余的,语句可以合并,语义更有意义。

  2. if (start == true)无需复杂,仅if(start)

  3. 使用using Statement将更好地确保IDisposableStreamReader一样正确使用。

  4. Path.Combine Method将两个字符串组合成一个路径。

  5. 两个foreach s最好是for,因为您是顺序地迭代数组。

  6. 不难看出,number_of_column不是必须使用的,您只是存储数组迭代的计数。


代码:

static void Main(string[] args) {
    int number_of_column; // never used
    if(Directory.Exists(path)) {
        var file1=(
            from f in dir.GetFiles()
            orderby f.LastWriteTime
            select f
            ).First().ToString();
        Console.WriteLine(file1);
        using(var sr=new StreamReader(Path.Combine(path, file1)))
            for(String line; null!=(line=sr.ReadLine()); ) {
                if(start) {
                    var line1=line.Split(',');
                    for(var i=0; i<line1.Length; ++i) {
                        var s=line1[i];
                        if("0"!=s||!String.IsNullOrEmpty(s))
                            col[i]="checked";
                    }
                    continue;
                }
                if(
                    line.Contains("Timestamp")
                    &&
                    line.Contains("LiveStandby")
                    &&
                    line.Contains("peak"
                    ))
                    start=true;
            }
        for(var i=0; i<col.Length; ++i) {
            // following lines are no more needed
            // if(i<number_of_column-1) {
            // }
        }
    }
}

尝试将第一行更改为:

static void Main(string[] args){ int number_of_column = 0;if (Directory.Exists(path))

或格式:

static void Main(string[] args)
{
    int number_of_column = 0;
    if (Directory.Exists(path)) ...

这意味着你没有给它赋任何初始值。

替换为

int number_of_column;

int number_of_column = 0;

作为一种防止副作用的机制,c#不允许使用未初始化的变量——已声明但没有显式设置值的变量。这就是你得到错误的原因。将其初始化为0可以解决这个问题。