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.NETMVCビューでnullをテストする方がはるかに簡単だからです。

4

1 に答える 1

4

.NETリフレクターを見ると、DBNullオブジェクトにフィールドがないことがわかります。DBNull(静的値フィールド)のインスタンスは常に1つあります。さらに、EqualsメソッドはDBNullクラスでオーバーライドされません。これは、Object.Equalsが呼び出され、参照の同等性をチェックする外部メソッド呼び出しを実行することを意味します。

結論:この呼び出しは2つのポインターを比較しており、パフォーマンスへの影響はどのような状況でも問題にはなりません。2つの整数値を比較するようなものです。

于 2011-04-11T15:03:07.043 に答える