1

所以,我有这段代码:

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

所以我知道这段代码是合理的,就“流”而言。它总是先创建表,然后再添加。但是,我构建代码的方式显然行不通。

我最初的想法是,如果我确实事先创建了 DataTable,(即DataTable table = new DataTable();)那么会有一个空表漂浮在周围。

这个应该怎么写?

4

2 回答 2

3

你知道,但不是编译器,所以初始化它null

DataTable table = null;
于 2018-06-22T03:06:10.487 回答
0

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

最初,您一直保持table未分配状态,并在此行中,

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

您正在创建一个表或调用AddToTable将表传递给该表的方法。

你知道这个文件有这样的数据,文件的第一行总是以“!”开头 ,但编译器在编译时无法确定这一事实。

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

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

为避免Backs 建议的此类错误,初始化表将为空(这将是最好的解决方案)

DataTable table = null;

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

void AddToTable(DataTable table)
{
    if(table != null)
    {
         //your logic
    }
}
于 2018-06-22T03:39:03.027 回答