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

談談幾個關鍵程式設計習慣:初始化、條件判斷與賦值陷阱

     編輯:關於ASP.NET

程式設計細節決定成敗,本文總結三個常見不良習慣與修正方案:int 初始化誤區、多條件判斷短路特性誤解、if 語句誤寫賦值為比較。

習慣一:int 屬性初始化與 ViewState 陷阱

錯誤程式碼

public int HighPrice 
{
    get
    {
        if (ViewState["HighPrice"] != null)
            return (int)ViewState["HighPrice"];
        else
            return -1; // 意圖:未設定時回傳 -1
    }
    set { ViewState["HighPrice"] = value; }
}

問題分析

  • int 為實值型別,預設值為 0,非 null。
  • 第一次存取時 ViewState[\"HighPrice\"] 為 null,但屬性 getter 會先檢查 ViewState,若為 null 回傳 -1。
  • **關鍵**:若開發者在 Page_Load 直接讀取 HighPrice 並判斷 == -1 來決定是否初始化,邏輯表面運作正常。
  • **隱患**:若程式碼其他地方直接對 HighPrice 賦值 0,ViewState 會儲存 0,後續判斷 == -1 失效,導致邏輯錯誤。

修正方案:明確的私有欄位與 TryParse

private int _highPrice = -1; // 明確預設值

public int HighPrice
{
    get
    {
        if (ViewState["HighPrice"] != null)
        {
            int.TryParse(ViewState["HighPrice"].ToString(), out _highPrice);
        }
        return _highPrice;
    }
    set
    {
        _highPrice = value;
        ViewState["HighPrice"] = _highPrice;
    }
}

優點:預設值集中定義、型別轉換安全、ViewState 與欄位同步。

習慣二:多條件判斷與短路運算誤解

錯誤認知

if (conditionA && conditionB) // 認為:兩者皆 true 才執行
// 實際:C# 邏輯與運算子 (&&) 為短路運算
// conditionA 為 false → 直接回傳 false,不評估 conditionB
// conditionA 為 true → 評估 conditionB,結果為 conditionB 的布林值

澄清

  • C# && **不會** 在兩者皆 false 時回傳 true。此描述可能源自其他語言 (如 VB6 And 為位元運算) 或誤解。
  • 正確行為:false && false = false、false && true = false、true && false = false、true && true = true。
  • 真正風險:conditionB 包含副作用 (如方法呼叫、賦值) 時,短路導致副作用不執行。

習慣三:if 語句誤寫 == 為 =

經典錯誤

if (flag = true) // 應為 ==
    DoSomething(); // 永遠執行,且 flag 被設為 true

防禦性寫法

  1. 常數前置:if (true == flag) → 若誤寫 true = flag 編譯錯誤 (常數不可為左值)。
  2. 單一條件省略比較:if (flag) 直接判斷布林值,消除 == 需求。
  3. 靜態分析工具:啟用編譯器警告 (C# `/warnaserror`)、SonarQube、ReSharper 等偵測賦值於條件中。

總結

習慣核心問題修正關鍵
int 初始化實值型別預設值與 ViewState null 檢查混淆私有欄位明確預設值 + TryParse
多條件判斷短路運算副作用 / 跨語言誤解理解短路語義、避免條件中副作用
if 語句比較誤寫賦值導致邏輯永真常數前置 / 省略 == / 靜態分析

養成防禦性編程習慣,從這些微小細節開始。

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