這個問題有時會出現(xiàn),但是我還沒有找到滿意的答案。典型的模式是(行是DataRow): if (row["value"] != DBNull.Value) { someObject.Member = row["value"]; }我的第一個問題是哪個效率更高(我已經翻轉了條件): row["value"] == DBNull.Value; // Or row["value"] is DBNull; // Or row["value"].GetType() == typeof(DBNull) // Or... any suggestions?這表明.GetType()應該更快,但是也許編譯器知道一些我不知道的技巧?第二個問題,是否值得緩存row [“ value”]的值,或者編譯器是否仍然優(yōu)化了索引器?例如: object valueHolder; if (DBNull.Value == (valueHolder = row["value"])) {}筆記:row [“ value”]存在。我不知道列的列索引(因此查找列名)。我在問有關檢查DBNull然后分配的問題(不是關于過早的優(yōu)化等)。我對一些場景進行了基準測試(時間以秒為單位,進行了10,000,000次試用):row["value"] == DBNull.Value: 00:00:01.5478995row["value"] is DBNull: 00:00:01.6306578row["value"].GetType() == typeof(DBNull): 00:00:02.0138757Object.ReferenceEquals具有與“ ==”相同的性能最有趣的結果?如果您按大小寫不匹配列名(例如,使用“值”而不是“值”,則花費的時間大約是字符串的十倍):row["Value"] == DBNull.Value: 00:00:12.2792374這個故事的寓意似乎是,如果您無法通過其索引查找列,那么請確保饋入索引器的列名稱與DataColumn的名稱完全匹配。緩存值似乎也快了將近一倍:No Caching: 00:00:03.0996622With Caching: 00:00:01.5659920因此,最有效的方法似乎是: object temp; string variable; if (DBNull.Value != (temp = row["value"])) { variable = temp.ToString(); }
3 回答

慕碼人8056858
TA貢獻1803條經驗 獲得超6個贊
您應該使用以下方法:
Convert.IsDBNull()
考慮到它是框架的內置組件,我希望它是最有效的。
我建議采取以下措施:
int? myValue = (Convert.IsDBNull(row["column"]) ? null : (int?) Convert.ToInt32(row["column"]));
是的,編譯器應該為您緩存它。

PIPIONE
TA貢獻1829條經驗 獲得超9個贊
編譯器不會優(yōu)化掉索引(也就是說,如果你使用行[“價值”]兩次),所以是的,它是稍微快做:
object value = row["value"];
然后使用價值兩次;如果為null,使用.GetType()可能會引發(fā)問題。
DBNull.Value實際上是一個單例,因此要添加第4個選項-您也許可以使用ReferenceEquals-但實際上,我認為您在這里擔心太多...我認為“ is”,“ ==”之間的速度不會有所不同“等將成為您看到的任何性能問題的原因。分析您的整個代碼并專注于重要的事情...并非如此。
- 3 回答
- 0 關注
- 520 瀏覽
添加回答
舉報
0/150
提交
取消