这个问题偶尔出现,但我没有看到一个满意的答案.
典型的模式是(row是DataRow):
if (row["value"] != DBNull.Value)
{
someObject.Member = row["value"];
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是哪个更有效率(我翻了条件):
row["value"] == DBNull.Value; // Or
row["value"] is DBNull; // Or
row["value"].GetType() == typeof(DBNull) // Or... any suggestions?
Run Code Online (Sandbox Code Playgroud)
这表明.GetType()应该更快,但编译器可能知道一些我不知道的技巧?
第二个问题,是否值得缓存row ["value"]的值,或者编译器是否优化了索引器?
例如:
object valueHolder;
if (DBNull.Value == (valueHolder = row["value"])) {}
Run Code Online (Sandbox Code Playgroud)
笔记:
我对几个场景进行了基准测试(时间以秒为单位,10,000,000次试验):
row["value"] == DBNull.Value: 00:00:01.5478995
row["value"] is DBNull: 00:00:01.6306578
row["value"].GetType() == typeof(DBNull): 00:00:02.0138757
Run Code Online (Sandbox Code Playgroud)
Object.ReferenceEquals与"=="具有相同的性能
最有趣的结果?如果您不匹配逐列的名称(例如,"值"而不是"值",则大约需要十倍的时间(对于字符串):
row["Value"] == DBNull.Value: 00:00:12.2792374
Run Code Online (Sandbox Code Playgroud)
故事的寓意似乎是,如果您无法通过索引查找列,请确保您提供给索引器的列名称与DataColumn的名称完全匹配.
缓存该值似乎也几乎快了两倍:
No Caching: 00:00:03.0996622
With Caching: 00:00:01.5659920
Run Code Online (Sandbox Code Playgroud)
所以最有效的方法 …