gpt4 book ai didi

.net - 检查 DBNull 然后分配给变量的最有效方法?

转载 作者:行者123 更新时间:2023-12-03 04:22:31 27 4
gpt4 key购买 nike

这个问题偶尔会出现,但我还没有看到令人满意的答案。

典型的模式是(行是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?

This表明 .GetType() 应该更快,但也许编译器知道一些我不知道的技巧?

第二个问题,是否值得缓存 row["value"] 的值,或者编译器是否会优化索引器?

例如:

  object valueHolder;
if (DBNull.Value == (valueHolder = row["value"])) {}

注释:

  1. 行[“值”]存在。
  2. 我不知道该列的列索引(因此需要查找列名称)。
  3. 我具体询问的是有关检查 DBNull 然后进行赋值的问题(而不是有关过早优化等)。

我对一些场景进行了基准测试(时间以秒为单位,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

Object.ReferenceEquals 与“==”性能相同

最有趣的结果?如果您按大小写不匹配列名称(例如,“Value”而不是“value”,则大约需要十倍的时间(对于字符串):

row["Value"] == DBNull.Value: 00:00:12.2792374

这个故事的寓意似乎是,如果您无法通过索引查找列,那么请确保您提供给索引器的列名称与 DataColumn 的名称完全匹配。

缓存该值的速度似乎也快了近两倍:

No Caching: 00:00:03.0996622
With Caching: 00:00:01.5659920

所以最有效的方法似乎是:

 object temp;
string variable;
if (DBNull.Value != (temp = row["value"]))
{
variable = temp.ToString();
}

最佳答案

我一定错过了什么。不检查 DBNull到底是什么 DataRow.IsNull 方法呢?

我一直在使用以下两种扩展方法:

public static T? GetValue<T>(this DataRow row, string columnName) where T : struct
{
if (row.IsNull(columnName))
return null;

return row[columnName] as T?;
}

public static string GetText(this DataRow row, string columnName)
{
if (row.IsNull(columnName))
return string.Empty;

return row[columnName] as string ?? string.Empty;
}

用法:

int? id = row.GetValue<int>("Id");
string name = row.GetText("Name");
double? price = row.GetValue<double>("Price");

如果你不想 Nullable<T>返回 GetValue<T> 的值,您可以轻松返回 default(T)或其他一些选项。

<小时/>

在一个不相关的注释中,这里有一个 VB.NET 替代 Stevo3000 的建议:

oSomeObject.IntMember = If(TryConvert(Of Integer)(oRow("Value")), iDefault)
oSomeObject.StringMember = If(TryCast(oRow("Name"), String), sDefault)

Function TryConvert(Of T As Structure)(ByVal obj As Object) As T?
If TypeOf obj Is T Then
Return New T?(DirectCast(obj, T))
Else
Return Nothing
End If
End Function

关于.net - 检查 DBNull 然后分配给变量的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/221582/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com