【问题标题】:C# Local VariableC# 局部变量
【发布时间】:2013-02-28 16:46:23
【问题描述】:

谁能解释我为什么会得到:

"使用未分配的局部变量 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)
            {

【问题讨论】:

  • 想想你为什么声明number_of_column是解决问题的第一步。

标签: c# variables local


【解决方案1】:

如果你从不进入while循环,变量没有赋值。

如果你在 if 中点击 else 分支,则变量没有赋值。

这些是您收到此错误消息的原因。

您可以通过在声明变量时分配一个值来解决此问题。

C# 要求您在使用局部变量之前对其进行初始化。 对于成员变量,这不是必需的,它们会自动分配默认值。

【讨论】:

  • @MarcinJuraszek 之后它看起来像是在 foreach 循环中
【解决方案2】:

完全精炼你的代码

  1. file 然后file1 只是多余的,语句可以合并并且在语义上更有意义。

  2. if (start == true) 太复杂了,只是if(start)

  3. 使用using Statement会更好地确保IDisposable的正确使用,如StreamReader

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

  5. 两个foreachs 最好是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) {
            // }
        }
    }
}

【讨论】:

    【解决方案3】:

    尝试将您的第一行更改为:

    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)) ...
    

    【讨论】:

      【解决方案4】:

      这意味着您没有为其分配任何初始值。

      替换这个

      int number_of_column;
      

      int number_of_column = 0;
      

      这将解决您的问题。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-24
          相关资源
          最近更新 更多