我有这段代码:
public int Delete(int id)
{
string query = "DELETE FROM [table] WHERE [id] = @id";
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
using (SqlCommand sqlCommand = new SqlCommand(query, sqlConnection))
{
sqlCommand.Parameters.Add("id", SqlDbType.Int).Value = id;
sqlConnection.Open();
if ((id = sqlCommand.ExecuteNonQuery()) == 0)
throw new Exception("Not found.");
return id;
}
}
可以重用参数ID来存储受影响的行数,还是应该声明新变量?什么通常更好?
答案 0 :(得分:5)
开发人员花费much more time reading code than writing code。因此,您的主要目标之一应该是编写易于阅读且易于理解的代码。
如果我必须阅读你的代码并浏览最后一行,我会得到你的方法返回某种标识符的(错误)印象。它没有。它返回已删除的行数。
使用不同的变量可以使您的代码更易于阅读,并且不会有任何性能损失。
...
var rowsDeleted = sqlCommand.ExecuteNonQuery();
if (rowsDeleted == 0)
throw new Exception("Not found.");
return rowsDeleted;
它还使您的代码对更改更加健壮:想象您有一天决定使用GUID而不是整数ID,因此您将参数类型更改为Guid
。怎么了?代码中一个完全不相关的部分,需要修复。
答案 1 :(得分:4)
你不应该问什么是更高效的,但更具可读性,因此不易出错。
参数是您要删除的ID。 ExecuteNonQuery
返回受影响记录的数量。这是两个不同的含义,因此您应该使用两个不同的变量。
int numDeleted = sqlCommand.ExecuteNonQuery();
if(numDeleted == 0)
throw new Exception("Could not delete record with id " + id);
else if(numDeleted > 1)
throw new Exception(numDeleted + " records deleted with id " + id);
return numDeleted;
答案 2 :(得分:1)
Is it OK to reuse parameter ID to store number of rows affected or should I rather declare new variable?
是的,可以使用相同的变量,因为int
是value type
,其他指令都不依赖于初始值。但是,正如Heinzi指出的那样,为了使您的代码更具可读性和可维护性,最好定义一个新代码