如何在vb.net中实现值类型的C#'as'关键字?

ste*_*ell 12 .net c# vb.net

我们的大多数开发都是在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)

Kon*_*lph 9

编辑

抱歉发芽这样的废话.我依靠Paul Vick(当时的VB团队负责人)而不是MSDN 发布的帖子,并没有安装Windows来测试代码.

我仍然会留下我的帖子 - 经过大量修改(请参阅编辑历史来阅读错误的原始文本) - 因为我发现这些点仍然有一些优点.

那么,再一次回顾三件事:

  1. 对于引用类型,C#as直接TryCast在VB中建模.

    但是,C#为通过拆箱处理值类型添加了一些额外的功能(即可以将值类型拆分为Nullable对应的值as).

  2. 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)
  1. 不要使用VB6样式的错误处理(On Error GoTo …On Error Resume [Next]).这是向后兼容的东西,便于VB6转换.相反,使用.NET的异常处理机制,就像在C#中一样.


Jos*_*lio 5

在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)