2

我知道担心可能还不够,但是 DBNull.Value.Equals() 检查的性能如何?

public IEnumerable<dynamic> Query(string sql, params object[] args)
{
    using (var conn = OpenConnection())
    {
        var rdr = CreateCommand(sql, conn, args).ExecuteReader(CommandBehavior.CloseConnection);
        while (rdr.Read())
        {
            var e = new ExpandoObject();
            var d = e as IDictionary<string, object>;
            for (var i = 0; i < rdr.FieldCount; i++)
                d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]);
            yield return e;
        }
    }
}

特别是,这一行:

d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]);

与原始代码(来自 Rob Conery 的 Massive 类)相比:

d.Add(rdr.GetName(i), rdr[i]);

肯定会至少产生很小的影响,同样可能不是真正值得注意的,但我很好奇。转换的原因是因为它更容易在 ASP.NET MVC 视图中测试 null。

4

1 回答 1

4

如果您查看 .NET 反射器,您会发现 DBNull 对象没有任何字段。DBNull 总是有一个实例(静态值字段)。此外,在 DBNull 类中没有重写 Equals 方法。这意味着 Object.Equals 被调用,它将执行一个外部方法调用来检查引用是否相等。

结论:这个调用是比较两个指针,性能影响在任何情况下都不是问题,就像比较两个整数值一样。

于 2011-04-11T15:03:07.043 回答