我们的大多数开发都是在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)
抱歉发芽这样的废话.我依靠Paul Vick(当时的VB团队负责人)而不是MSDN 发布的帖子,并没有安装Windows来测试代码.
我仍然会留下我的帖子 - 经过大量修改(请参阅编辑历史来阅读错误的原始文本) - 因为我发现这些点仍然有一些优点.
那么,再一次回顾三件事:
对于引用类型,C#as直接TryCast在VB中建模.
但是,C#为通过拆箱处理值类型添加了一些额外的功能(即可以将值类型拆分为Nullable对应的值as).
VB 9为If运算符提供了两个不同的C#运算符:nullcoalescing(??)和conditional(?:),如下所示:
' Null coalescing: '
Dim result = If(value_or_null, default_value)
' Conditional operator: '
Dim result = If(condition, true_value, false_value)
Run Code Online (Sandbox Code Playgroud)
与之前的IIf功能不同,这些是真正的短路运算符,即只执行必要的部分.特别是,下面的代码将编译并运行得很好(它不会,使用IIf函数,因为我们可以除以零):
Dim divisor = Integer.Parse(Console.ReadLine())
Dim result = If(divisor = 0, -1, 1 \ divisor)
Run Code Online (Sandbox Code Playgroud)
On Error GoTo …或On Error Resume [Next]).这是向后兼容的东西,便于VB6转换.相反,使用.NET的异常处理机制,就像在C#中一样.在VB 9.0中,"IF"是一个真正的合并操作,相当于C#的"??".来源MSDN:
所以你可以使用:
oObject.Name = IF(oReader.Item("Name").Equals(DBNull.Value),string.Empty,DirectCast(oReader.Item("Name"), String))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3381 次 |
| 最近记录: |