这些代码中的哪一段更快?
if (obj is ClassA) {}
if (obj.GetType() == typeof(ClassA)) {}
Run Code Online (Sandbox Code Playgroud)
编辑:我知道他们不会做同样的事情.
我经常遇到处理DataRows退回的问题SqlDataAdapters.当我尝试使用如下代码填充对象时:
DataRow row = ds.Tables[0].Rows[0];
string value = (string)row;
Run Code Online (Sandbox Code Playgroud)
DBNull's在这种情况下处理这种情况的最佳方法是什么.
如果VB.NET我有DataRow,我想测试列值是否Null,我应该使用:
myDataRow.IsNull("Column1")
Run Code Online (Sandbox Code Playgroud)
要么
IsDBNull(myDataRow("Column1"))
Run Code Online (Sandbox Code Playgroud) 我们的大多数开发都是在vb.net中完成的(不是我的选择),一个经常使用的代码模式使用'On Error GoTo'后跟'Resume Next',以便所有数据库字段都可以使用DirectCast()读取DBNull值只是被忽略.
目前的代码是
On Error GoTo error_code
oObject.Name = DirectCast(oReader.Item("Name"), String)
oObject.Value = DirectCast(oReader.Item("Value"), Integer)
error_code:
Resume Next
Run Code Online (Sandbox Code Playgroud)
C#代码替换这个启用删除On Error代码即可
oObject.Name = oReader["Name"] as string ?? string.Empty;
oObject.Value = oReader["Value"] as int? ?? -1;
Run Code Online (Sandbox Code Playgroud)
问题是这个C#代码的vb.net eqivelent使用TryCast(),它只能用于引用类型(可空类型是值类型),而C#as关键字可以用于引用和可空类型.
总而言之,有没有人有一个vb.net代码的例子,它在每个数据库字段的单行中与C#代码做同样的事情?
-编辑-
在我们的案例中,我已经确定了我认为最好的解决方案.Helper方法不适合(由于管理),我们不能使用扩展方法,因为我们只使用.NET 2.0(尽管使用VS 2008,因此我们获得了If())
oObject.Name = If(oReader.IsDBNull(oReader.GetOrdinal("Name")), String.Empty, oReader.GetString(oReader.GetOrdinal("Name")))
oObject.Value = If(oReader.IsDBNull(oReader.GetOrdinal("Value")), 0, oReader.GetInt32(oReader.GetOrdinal("Value")))
Run Code Online (Sandbox Code Playgroud) 为什么以下代码:
A = not IsDBNull(CurRow("BuyBook")) AndAlso CType(CurRow("BuyBook"), string) = "Yes"
Run Code Online (Sandbox Code Playgroud)
导致以下错误:
Conversion from type 'DBNull' to type 'String' is not valid.
Run Code Online (Sandbox Code Playgroud)
当AndAlso根据这篇文章被认为是短路的时候:
我目前正在使用此方法从DataReader读取数据 -
private T GetValue<T>(object obj)
{
if (typeof(DBNull) != obj.GetType())
{
return (T)obj;
}
return default(T);
}
Run Code Online (Sandbox Code Playgroud)
将上述方法称为 -
GetValue<int>(dataReader["columnName1"])
GetValue<string>(dataReader["columnName2"])
GetValue<float>(dataReader["columnName3"])
Run Code Online (Sandbox Code Playgroud)
但是,当columnName3具有7200000与错误一样的值时,这会失败
Invalid Cast Exception.
我正在考虑修改我的替换方法 -
return (T)obj;
Run Code Online (Sandbox Code Playgroud)
同
return (T)Convert.ChangeType(obj, typeof(T));
Run Code Online (Sandbox Code Playgroud)
但期待更好的方式,因为这种变化将涉及两次类型铸造.
有更好的想法吗?
谢谢!
更换(int)reader[0]有reader.GetInt32(0)什么好处?我确信这样的投射功能是有原因的,但除了感觉更美观以至于避免演员本人之外,我不确定这些原因是什么.