C# 使用从存储过程创建的未分配局部变量(对象)

C# 使用从存储过程创建的未分配局部变量(对象),c#,stored-procedures,C#,Stored Procedures,我正在从存储过程创建类的实例,但出现以下错误: 未分配局部变量“member”的使用 我有以下代码: Member member; while (rdr.Read()) { member = new member(rdr.GetInt32, rdr.GetString(1)); // Populate Class from Stored Procedure } return member 我意识到编译器并不知道while循环总是会被触发,但是在不创建默认构造函数的情况下,解决这个问题的

我正在从存储过程创建类的实例,但出现以下错误:

未分配局部变量“member”的使用

我有以下代码:

Member member;
while (rdr.Read())
{
    member = new member(rdr.GetInt32, rdr.GetString(1)); // Populate Class from Stored Procedure
}
return member

我意识到编译器并不知道while循环总是会被触发,但是在不创建默认构造函数的情况下,解决这个问题的最干净的方法是什么?

问题:

  • 您应该在
    while
    循环之前分配
    成员
    变量,因为
    编译器
    无法确定是否将执行另一个循环

  • 使用
    GetInt32()
    函数时,需要指定列号

  • 解决方案:

  • 最初将
    memebr
    分配给
    null
  • GetInt32()
    函数中使用必需的列
    索引
    试试这个:

    Member member=null;
    while (rdr.Read())
    {
        member = new member(rdr.GetInt32(0), rdr.GetString(1)); // Populate Class from Stored Procedure
    }
    return member;
    

    编译器无法确定循环的条件是否为真,并且
    成员是否将被初始化。因此,这是一个错误

    因为您在循环之后返回
    成员
    ,并且在循环内部完成实例化。不能保证
    成员
    将被初始化/分配一个值
    rdr.Read()
    在第一次迭代中可能返回false

    你可以做:

    Member member = default(Member); //null for reference type
    while (rdr.Read())
    {
        member = new member(rdr.GetInt32, rdr.GetString(1)) // Populate Class from Stored Procedure
    }
    return member;
    
    代码中的另一个错误是使用了
    rdr.GetInt32
    ,它是一种方法,应该指定列序号,如下所示:

    rdr.GetInt32(0)