如何在vb.net中实现C#中的'value types'的'as'关键字?
如何在vb.net中实现C#中的'value types'的'as'关键字?
我们大部分的开发工作都是使用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
用来替代这个代码并且能够去除'On Error'代码的C#代码如下:
oObject.Name = oReader["Name"] as string ?? string.Empty; oObject.Value = oReader["Value"] as int? ?? -1;
问题在于,vb.net中没有与C#中的as关键字相对应的TryCast(),因为TryCast()只能用于引用类型(可为空类型是值类型),而C#的as关键字既可以用于引用类型,也可以用于可为空类型。
总结一下,有没有人能提供一个在每个数据库字段中只用一行代码实现与C#代码相同功能的vb.net代码的示例?
-编辑-
在我们的情况下,我已经决定了我认为是最好的解决方案。帮助方法不适用于我们(因为受管理限制),而且我们无法使用扩展方法,因为我们只使用.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")))
问题的出现原因:在VB.NET中,value types(即值类型)不能像C#中的'as'关键字一样进行转换。这导致了在处理数据库查询结果时的一些麻烦,需要使用一些复杂的代码来处理null值。
解决方法:为了解决这个问题,可以使用IsDbNull
方法来检查null值,而不是使用try-fail-handlefailure的方式。通过在条件语句中使用If
函数,可以将代码简化为一行。另外,可以编写一些辅助函数来提高代码的可读性和效率。这些函数可以作为扩展方法添加到DbDataReader
类中,以进一步提高代码的可读性。还可以为GetXOrDefault方法提供带有和不带默认值的重载,类似于Nullable.GetValueOrDefault方法。
问题的原因是在VB.NET中没有与C#的'as'关键字相对应的功能,即对值类型进行类型转换的操作。解决方法是使用VB.NET中的'If'操作符来实现类似的功能,可以使用三个参数的'If'操作符来代替C#中的'as'关键字。
在VB 9.0中,'If'操作符是一个真正的合并操作,相当于C#中的'??'操作符。可以使用以下代码来实现:
oObject.Name = If(oReader.Item("Name").Equals(DBNull.Value), String.Empty, DirectCast(oReader.Item("Name"), String))
这个答案很好,虽然不如我在问题中提到的C#代码那样简洁,但绝对是我看到的最接近的答案。
还有一个更简单的变体可以使用两个参数的'If'操作符来实现。
'IF'和'IIF'之间有什么区别?
根据MSDN的解释:"使用三个参数调用的If操作符的工作方式类似于IIf函数,但它使用短路求值。IIf函数总是评估其三个参数,而具有三个参数的If操作符只评估其中两个参数。"
如何在VB.NET中实现C#中的值类型的'as'关键字?
在这个问题中,提问者想要知道如何在VB.NET中实现C#中的值类型的'as'关键字。提问者最初错误地依赖于VB团队的Paul Vick的一篇文章,而不是MSDN文档,所以他提供的答案是错误的。尽管如此,他的回答仍然有一定的价值,所以他保留了回答,但进行了修改。
首先,对于引用类型,C#中的'as'关键字可以直接通过VB中的'TryCast'关键字来实现。不过,C#通过拆箱操作增加了一些额外的功能,可以将值类型拆箱为其Nullable类型的对应类型,而VB中则没有这个功能。
其次,VB.NET 9提供了'If'运算符,用于实现C#中的两个不同的运算符:空值合并运算符和条件运算符。与之前的'IIf'函数不同,'If'运算符是真正的短路运算符,只执行必要的部分。这使得以下代码可以编译和运行,但如果使用'IIf'函数,则会出错。
最后,不要使用VB6风格的错误处理机制,而应该使用与C#相同的.NET异常处理机制。
,VB.NET中无法直接实现C#中的'as'关键字对值类型的处理,但可以通过其他方式来实现相似的功能。