我知道这可能不足以担心,但是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更容易。

最佳答案

如果查看.NET反射器,则可以看到DBNull对象没有任何字段。总有一个DBNull实例(静态Value字段)。此外,在DBNull类中不会覆盖Equals方法。这意味着将调用Object.Equals,它将进行外部方法调用以检查引用是否相等。

结论:此调用正在比较两个指针,并且在任何情况下都不会对性能造成影响,就像比较两个整数值一样。

关于c# - DBNull.Value.Equals()检查性能如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5623129/

10-15 03:11