使用未分配的局部变量 - 但我知道当程序到达它时,它将被分配
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
}
}
所以,我有这段代码:
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
}
}