使用foreach循环时使用未分配的局部变量

界线

我有一个代码块,可以从存储过程中获取一些数据。收到数据后,我想根据条件将值分配给“ isExisting”。我不想在声明时将值分配给“ isExisting”。

bool isExisting;
using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("some_stored_procedure", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("input", value));
        using (var adapter = new SqlDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            if (ds.Tables.Count > 0)
            {
                if (ds.Tables[0].Rows.Count == 0)
                    isExisting = false;
                else
                {
                    foreach (DataRow row in ds.Tables[0].Rows)
                    {
                        if (row["Key"].ToString() == ValueToCompareWith)
                        {
                            isExisting = true;
                            break;
                        }
                        else
                            isExisting = false;
                    }
                }

            }
            else
                isExisting = false;
        }
    }
}
if (!isExisting) //Step :getting error "use of unassigned local variable"
{
}

我认为我已经涵盖了所有条件,并且变量“ isExisting”在到达“ Step”时将具有一个值,但是仍然出现编译器错误。

问题开始,因为我的代码审查工具引发了评论

“当为局部变量分配一个值,该值不会被任何后续指令读取时,就会发生死存储。仅计算或检索一个值,然后覆盖或丢弃它,这可能表示代码中存在严重错误。即使不是错误,最多不过是浪费资源。因此,应使用所有计算出的值。”
不兼容的代码示例

void CalculateRate(int a, int b)
{
  int i;

  i = a + b; // Noncompliant; calculation result not used before value is overwritten
  i = DoSomething();  // Noncompliant; retrieved value not used
  for (i = 0; i < 10; i++)
  {
    //  ...
  }
  // ...
}
JLRishe

正如其他人指出的那样,编译器不够聪明,无法知道您是否实际上在为变量赋值。

您可以通过使用一些Linq来解决这种歧义,并清理很多代码:

bool isExisting;
using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("some_stored_procedure", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("input", value));
        using (var adapter = new SqlDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            adapter.Fill(ds);

            isExisting = ds.Tables
                .OfType<DataTable>()
                .Take(1)
                .SelectMany(t => t.Rows.OfType<DataRow>())
                .Any(r => r["Key"].ToString() == ValueToCompareWith);
        }
    }
}
if (!isExisting)
{
}

另一种方法是将isExisting支票排除在一个单独的方法之外:

bool CheckIsExisting(object value, string valueToCompareWith) 
{
    using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("some_stored_procedure", conn))
       {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("input", value));
            using (var adapter = new SqlDataAdapter(cmd))
            {
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                if (ds.Tables.Count != 0 && ds.Tables[0].Rows.Count != 0)
                {
                    foreach (DataRow row in ds.Tables[0].Rows)
                    {
                        if (row["Key"].ToString() == ValueToCompareWith)
                        {
                            return true;
                        }
                    }
               }
           }
       }
    }

    return false;
}

然后做:

if (!CheckIsExisting(value, ValueToCompareWith))
{
    // do something...
}         

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

LINQ,输出参数和“未分配的局部变量的使用”错误

来自分类Dev

在分配它的if-else语句中使用未分配的局部变量

来自分类Dev

创建自身关闭的匿名函数时使用未分配的局部变量

来自分类Dev

“使用未分配的局部变量”错误的原因是什么?

来自分类Dev

抑制“使用未分配的局部变量”错误?

来自分类Dev

在while条件中使用未分配的局部变量和“无法写入已关闭的TextWriter”。

来自分类Dev

使用未分配的局部变量c#

来自分类Dev

在尝试捕获中使用未分配的局部变量

来自分类Dev

使用异步/等待时使用未分配的局部变量

来自分类Dev

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

来自分类Dev

在finally块上使用未分配的局部变量

来自分类Dev

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

来自分类Dev

C#Winform使用未分配的局部变量

来自分类Dev

在foreach循环中出现“使用未分配的局部变量”错误,并返回收益

来自分类Dev

C#使用未分配的局部变量(2个不同的循环,int)

来自分类Dev

在Graphics.Drawing中使用未分配的局部变量

来自分类Dev

错误在C#中使用未分配的局部变量(开关)

来自分类Dev

使用已分配的未分配局部变量

来自分类Dev

使用Try,catch,finally的局部变量未分配问题

来自分类Dev

在调试中使用未分配的局部变量

来自分类Dev

使用未分配的局部变量数组

来自分类Dev

C#使用未分配的局部变量

来自分类Dev

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

来自分类Dev

在程序中使用非类型模板参数而未分配局部变量时出现意外结果?

来自分类Dev

C#使用未分配的局部变量异常

来自分类Dev

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

来自分类Dev

错误“使用未分配的局部变量”?

来自分类Dev

尝试返回 bool 时使用未分配的局部变量

来自分类Dev

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

Related 相关文章

  1. 1

    LINQ,输出参数和“未分配的局部变量的使用”错误

  2. 2

    在分配它的if-else语句中使用未分配的局部变量

  3. 3

    创建自身关闭的匿名函数时使用未分配的局部变量

  4. 4

    “使用未分配的局部变量”错误的原因是什么?

  5. 5

    抑制“使用未分配的局部变量”错误?

  6. 6

    在while条件中使用未分配的局部变量和“无法写入已关闭的TextWriter”。

  7. 7

    使用未分配的局部变量c#

  8. 8

    在尝试捕获中使用未分配的局部变量

  9. 9

    使用异步/等待时使用未分配的局部变量

  10. 10

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

  11. 11

    在finally块上使用未分配的局部变量

  12. 12

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

  13. 13

    C#Winform使用未分配的局部变量

  14. 14

    在foreach循环中出现“使用未分配的局部变量”错误,并返回收益

  15. 15

    C#使用未分配的局部变量(2个不同的循环,int)

  16. 16

    在Graphics.Drawing中使用未分配的局部变量

  17. 17

    错误在C#中使用未分配的局部变量(开关)

  18. 18

    使用已分配的未分配局部变量

  19. 19

    使用Try,catch,finally的局部变量未分配问题

  20. 20

    在调试中使用未分配的局部变量

  21. 21

    使用未分配的局部变量数组

  22. 22

    C#使用未分配的局部变量

  23. 23

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

  24. 24

    在程序中使用非类型模板参数而未分配局部变量时出现意外结果?

  25. 25

    C#使用未分配的局部变量异常

  26. 26

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

  27. 27

    错误“使用未分配的局部变量”?

  28. 28

    尝试返回 bool 时使用未分配的局部变量

  29. 29

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

热门标签

归档