[英]Wrapping a Using Block inside of another Using Block - is it overkill?
我在我的項目中有一段代碼,我在另一個使用塊中包含一個使用塊,我想知道這是一個好習慣還是矯枉過正(請注意我明白這是一個非常簡單的代碼片段,它是僅用於說明目的):
protected void Submit_Click(object sender, EventArgs e)
{
try
{
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegConnectionString"].ConnectionString))
{
cn.Open();
string cmdStr = "SELECT COUNT(*) FROM REGISTRATION WHERE UserName ='" + this.TextBoxUN.Text + "' ";
using (SqlCommand selectUser = new SqlCommand(cmdStr, cn))
{
int temp = Convert.ToInt32(selectUser.ExecuteScalar().ToString());
if (temp == 0)
{
string insCmd = "Insert INTO REGISTRATION (UserName, Password, EmailAddress, FullName, Country) VALUES (@UserName, @Password, @EmailAddress, @FullName, @Country)";
using (SqlCommand insertUser = new SqlCommand(insCmd, cn))
{
try
{
insertUser.Parameters.AddWithValue("@UserName", this.TextBoxUN.Text);
insertUser.Parameters.AddWithValue("@Password", this.TextBoxPass.Text);
insertUser.Parameters.AddWithValue("@EmailAddress", this.TextBoxEA.Text);
insertUser.Parameters.AddWithValue("@FullName", this.TextBoxFN.Text);
insertUser.Parameters.AddWithValue("@Country", this.DropDownListCountry.SelectedItem.ToString());
insertUser.ExecuteNonQuery();
Response.Redirect("~/Login.aspx");
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
}
else
{
Response.Write("User already Exists in Database");
}
}
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
}
是。 好的做法。 在盡可能小的范圍內處理物品,否則你將它留在GC做一段時間以后。
絕對可以using
語句嵌套。 每個using
語句僅適用於一個對象,因此如果有幾個需要處理,請使用多個using
語句。
此外,您可以通過在打開第二個命令之前關閉第一個命令來減少嵌套。
int temp;
using (SqlCommand selectUser = new SqlCommand(cmdStr, cn))
{
temp = Convert.ToInt32(selectUser.ExecuteScalar().ToString());
}
if (temp == 0)
{
string insCmd = ...;
using (SqlCommand insertUser = new SqlCommand(insCmd, cn))
{
...
}
}
我完全同意在處理嵌套的一次性對象時必須使用using
語句。
但是,我建議進一步更改代碼。 為了使您的代碼可讀,可測試和可維護,最好使用函數組合。 這是我將如何更改代碼的主體:
using (var cn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegConnectionString"].ConnectionString))
{
cn.Open();
if (checkUserExists(cn, this.TextBoxUN.Text))
{
Response.Write("User already Exists in Database");
}
else
{
addUser(cn, this.TextBoxUN.Text, this.TextBoxPass.Text, this.TextBoxEA.Text, this.TextBoxFN.Text, this.DropDownListCountry.SelectedItem.ToString());
Response.Redirect("~/Login.aspx");
}
cn.Close();
}
此代碼更緊湊,更容易推斷正在發生的事情。
在此代碼之前,您需要定義checkUserExists
和addUser
lamdbas,如下所示:
Func<SqlConnection, string, bool> checkUserExists = (cn, un) =>
{
var query = "SELECT COUNT(*) FROM REGISTRATION WHERE UserName = @UserName";
using (var command = new SqlCommand(query, cn))
{
command.Parameters.AddWithValue("@UserName", un);
return Convert.ToInt32(command.ExecuteScalar().ToString()) != 0;
}
};
Action<SqlConnection, string, string, string, string, string> addUser = (cn, un, pw, e, fn, c) =>
{
string query = "Insert INTO REGISTRATION (UserName, Password, EmailAddress, FullName, Country) VALUES (@UserName, @Password, @EmailAddress, @FullName, @Country)";
using (var command = new SqlCommand(query, cn))
{
command.Parameters.AddWithValue("@UserName", un);
command.Parameters.AddWithValue("@Password", pw);
command.Parameters.AddWithValue("@EmailAddress", e);
command.Parameters.AddWithValue("@FullName", fn);
command.Parameters.AddWithValue("@Country", c);
command.ExecuteNonQuery();
}
};
這些中的每一個都非常簡單,其意圖清晰易懂。
因為它們是lambdas,所以它們不會用不必要的方法阻塞你的類 - 它們都包含在一個方法中。 漂亮,干凈整潔。
當然他們都使用using
語句。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.