bool.TryParse 一個美麗的誤會
找到一個深埋很久的bug,
一直以為以下的Code 若parse error 會傳回預設的true,
誤會: TryParse 失敗不會改變更參數b (大誤
bool.TryParse(p, out b)
實際上是會的,故當parse error時,b 永遠是 false
正確的code如下
b = bool.TryParse(p, out b) ? b : def;
測試碼:
bool b = true;
string s = bool.TryParse(p, out b) ? b.ToString() : "default " + def;
if (p == null)
p = "*** is null ***";
textBox1.Text = textBox1.Text + "\r\n[" +p+ "] " + s;
}
測試結果:(不分大小寫,但無法處理0或1, Y或N , OK或NO)
testTryParse("", true); // default true
testTryParse("true", false); // true
testTryParse("True", false); // true
testTryParse("TRUE", false); // true
testTryParse(null, false); // default false
testTryParse("", false); // default false
testTryParse("false", true); // false
testTryParse("False", true); // false
testTryParse("FALSE", true); // false
testTryParse("0", true); // default true
testTryParse("N", true); // default true
testTryParse("OK", true); // default true
同理數值在TryParse時亦會變更參數為0
2010/11/19 再加碼一個簡易, 功能更多的轉換程式碼
if(str==null)
return false;
bool rtnValue = false;
rtnValue = bool.TryParse(str, out rtnValue) ? rtnValue :
Regex.IsMatch(str, "^(?i:true|yes|y|1|ok|是)$");
return rtnValue;
}