使用未分配的局部变量 - 但我知道当程序到达它时,它将被分配

Use of unassigned local variable - but I know that by the time the program reaches it, it will be assigned

所以,我有这段代码:

void Readfile()
{
    using (reader = new StreamReader(file))
    {
        string line = "";
        DataTable table;

        // Search for relevant "tables" in the file
        while ((line = reader.ReadLine()) != null)
        {
            if (line.StartsWith("!"))
            {
                table = CreateDataTable(reader, line);
            }
            else
            {
                AddToTable(table); // Error: "Unassigned local variable"
            }
        }
    }
}

DataTable CreateDataTable(StreamReader reader, string line)
{
    if (line.Contains("!CUST"))
    {
        DataTable custTable = new DataTable();
        custTable.TableName = "Customer";

        string[] columns = line.Split(Convert.ToChar(9));

        foreach (string s in columns)
        {
            custTable.Columns.Add(s);
        }
        return custTable;
    }
    return null;
}

此程序正在读取的文件将始终采用以下格式:

!Line1
Line2
Line3
!Line4
[etc...]

所以 我知道 这个代码是合理的,就 "flow" 而言。它总是先创建 Table,然后再添加到它。但是,我构造代码的方式显然行不通。

我最初的想法是,如果我确实事先创建了数据Table(即DataTable table = new DataTable();),那么就会有一个空的table浮动。

这个应该怎么写?

你知道,但不是编译器,所以用 null:

初始化它
DataTable table = null;

您正在从 file 获取台词。可以是任何文件。 ( 如果它正在生产中并且用户更改了该文件 - 即使您作为程序员也不确定第一行是否以 !)

最初你保持 table 未分配并且 在这条线上,

while ((line = reader.ReadLine()) != null)
{
    if (line.StartsWith("!"))
    {
        table = CreateDataTable(reader, line);
    }
    else
    {
        AddToTable(table); // Error: "Unassigned local variable"
    }
}

您正在创建 table 或调用 AddToTable 方法将 table 传递给它。

您知道该文件包含这样的数据,即文件的第一行始终以“!”开头, 但编译器在编译时无法确定这一事实。

所以while循环有两种情况:if和else。流进入 if 或 in else 的机会均等。

所以编译器总是会担心,如果流程进入 else 部分,那么在第一次迭代时,到那时 table 将不会被分配给任何值(甚至不是 null)。所以它产生了编译时错误。

为了避免Backs suggested这样的错误,initailize table will null (which will be the best solution)

DataTable table = null;

当你这样做时,为了安全起见,你应该在第一行的 AddToTable 方法中检查 table is not null。

void AddToTable(DataTable table)
{
    if(table != null)
    {
         //your logic
    }
}