C# for迴圈 建立model 在迴圈裡和迴圈外引發的問題
阿新 • • 發佈:2020-04-24
今天遇到一個非常難找的Bug,記錄下來以備不時之需。
做的這個程式是用來統計員工每天產量的,有正常班產量,和加班產量。如果該員工某天的產量已經提取過來,就更新原來記錄。如果沒有提取過就新增一條記錄。
大概過程是這樣的,假如有10個員工。
/// <param name="strType">1代表正常班產量 2代表加班產量</param> private void GetWorkCount(string strType) { //建立產量記錄Model Model.WV_WorkRecord model = new Model.WV_WorkRecord(); for (int i = 0; i < 10; i++) { bool flag; //為了表示 是否存在產量記錄 //員工ID int lngUserID=i; string strStartDate = "2020-01-01"; model.WorkerID = lngUserID; //員工產量日期 model.WorkDate = strStartDate; // ....這裡寫判斷是否存在產量記錄的程式碼 model2 = BLL.WV_WorkRecord.Instance.GetModel(" workId=" + lngUserID + " and workDate=‘" + strStartDate + "‘"); /// if (flag) //是否存在 產量記錄 存在更新原來記錄,不存在新增一條記錄 { model = model2; //model2 是從資料庫裡取出來的原來就存在的那條記錄 if (strType == "1") { //員工正常班產量 model.WorkCount = workCount; } else if (strType == "2") { //員工加班產量 model.WorkAddCount = workAddCount; } flag = BLL.WV_WorkRecord.Instance.Update(model); } else { if (strType == "1") { //員工正常班產量 model.WorkCount = workCount; } else if (strType == "2") { //員工加班產量 model.WorkAddCount = workAddCount; } flag = BLL.WV_WORKRECORDD.Instance.Add(model); } } }
Model.WV_WorkRecord model = new Model.WV_WorkRecord(); 寫在了for迴圈外。你覺得有問題沒有?
我最開始寫外邊是考慮到放在迴圈裡,每次迴圈都需要New一個物件,如果迴圈次數太多,是不是太浪費記憶體資源了,所以就提到了for迴圈外,結果就造成了錯誤,而且很難排查問題。因為只有極個別記錄會有問題,所以也就造成了很難排查。
大家想一下這種情況,我現在要獲取加班產量記錄到資料庫,如果第1個人在資料庫裡已經有了記錄,這時候model就會指向資料庫裡已經有的那條記錄的model,緊接著獲取第2個人的加班產量,第2個人在資料庫裡沒有過記錄,
我要新增進去。你會發現你只通過 “model.WorkAddCount = workAddCount;” 這句程式碼修改了加班產量, 正常班產量確指向第1個人的正常班產量。所以以後要注意了,改寫迴圈裡就寫迴圈裡!
當然,也不是說所有情況都要放迴圈裡,特殊情況特殊對待!