首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

out 參數陷阱:同一變量多次傳遞導致數據錯亂

     編輯:關於.NET

一個看似無害的重載調用,卻因 out 參數的引用傳遞特性導致嚴重邏輯錯誤。記錄一次真實踩坑經歷,警示開發者注意值類型的引用語義。

場景:帶輸出參數的查詢方法

int GetRest(out int all, out int usedCount, out int invalidCount)
{
    all = 10;           // 模擬 GetAll()
    usedCount = 5;      // 模擬 GetUsedCount()
    invalidCount = 3;   // 模擬 GetInvalidCount()
    return all - usedCount - invalidCount; // 返回剩余量
}

偷懶的重載:復用同一臨時變量

調用方常不需要三個輸出值,於是寫了無參重載:

int GetRest()
{
    int temp;
    return GetRest(out temp, out temp, out temp); // 編譯通過!
}

災難現場:三個輸出參數指向同一內存地址

out 參數本質是引用傳遞。三個形參 all、usedCount、invalidCount 綁定到同一個 temp 變量。方法內依次賦值:

  1. all = 10 → temp = 10
  2. usedCount = 5 → temp = 5(覆蓋)
  3. invalidCount = 3 → temp = 3(再次覆蓋)

最終三個輸出參數均為 3,返回值 3 - 3 - 3 = -3,完全錯誤。

修正:每個 out 參數使用獨立變量

int GetRest()
{
    int temp1, temp2, temp3;
    return GetRest(out temp1, out temp2, out temp3);
}

核心教訓

  • out/ref 參數傳遞的是變量地址,而非值副本。
  • 值類型默認按值傳遞,只有通過 out/ref 才能實現多個變量別名指向同一內存,這在無意中極易發生。
  • 編譯器不會警告「同一變量多次作為 out 參數」,需開發者自行警惕。

調試時善用「局部變量」窗口觀察地址/值變化,可快速定位此類問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved