程式設計細節決定成敗,本文總結三個常見不良習慣與修正方案:int 初始化誤區、多條件判斷短路特性誤解、if 語句誤寫賦值為比較。
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。HighPrice 並判斷 == -1 來決定是否初始化,邏輯表面運作正常。HighPrice 賦值 0,ViewState 會儲存 0,後續判斷 == -1 失效,導致邏輯錯誤。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 的布林值
&& **不會** 在兩者皆 false 時回傳 true。此描述可能源自其他語言 (如 VB6 And 為位元運算) 或誤解。false && false = false、false && true = false、true && false = false、true && true = true。conditionB 包含副作用 (如方法呼叫、賦值) 時,短路導致副作用不執行。if (flag = true) // 應為 ==
DoSomething(); // 永遠執行,且 flag 被設為 true
if (true == flag) → 若誤寫 true = flag 編譯錯誤 (常數不可為左值)。if (flag) 直接判斷布林值,消除 == 需求。| 習慣 | 核心問題 | 修正關鍵 |
|---|---|---|
| int 初始化 | 實值型別預設值與 ViewState null 檢查混淆 | 私有欄位明確預設值 + TryParse |
| 多條件判斷 | 短路運算副作用 / 跨語言誤解 | 理解短路語義、避免條件中副作用 |
| if 語句比較 | 誤寫賦值導致邏輯永真 | 常數前置 / 省略 == / 靜態分析 |
養成防禦性編程習慣,從這些微小細節開始。