我有一个代码块,可以从存储过程中获取一些数据。收到数据后,我想根据条件将值分配给“ 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++)
{
// ...
}
// ...
}
正如其他人指出的那样,编译器不够聪明,无法知道您是否实际上在为变量赋值。
您可以通过使用一些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] 删除。
我来说两句