我只是想知道如何正确
正确使用任何类型的任何Ctypes。我打开了Option Strict,现在出现了所有这些错误,所以我试图解决它们:)
答案 0 :(得分:3)
NET提供了几种检查,测试和转换数据的方法。
<强>的TryParse 强>
这可能是最无懈可击的转换方式。它是验证用户输入的理想选择:
Dim n As Int32
If Int32.TryParse(TextBox.Text, n) Then
' work with n
Else
' error handling: TextBox.Text cannot convert to int
End If
所有核心数据类型都支持它(Int64
,Decimal
,Date
等)。它与其他不同:它不返回转换后的值,而是返回Boolean
,指示源字符串是否可以转换为变量。
<强>解析强>
Dim d as Double = Double.Parse(strVar)
这可以在您的代码创建strVar
时使用,并且您知道它包含数字而不是标点符号等。Parse
和TryParse
都允许您通过提供来解析来自其他文化的数据一个FormatProvider
和其他选项:
Dim strDec = "$ 123.45"
Dim decVal As Decimal = Decimal.Parse("$123.45", NumberStyles.Currency)
其他方法会阻塞“$”,style参数允许它。
Convert.ToInt32 / Convert.ToInteger
这个有很多重载:
Dim intV As Int32 = Convert.ToInt32(aString)
Dim dblV As Double = Convert.ToDouble(aString)
Dim lngV As Int64 = Convert.ToInt64(aString)
Convert.Toxxx
方法的专业性略低于上述方法。他们允许进行文化转换,但他们认为可以进行直接转换。也就是说,“123”将转换为整数,但不会转换为“123.45”,并且它不会像货币格式那样知道任何事情。
因此,当您知道值可以转换时使用此方法,可能是因为您将值转换为字符串。这些也适用于从数据库DataReader
中取消装箱对象:
myDT = Convert.ToDateTime(rdr("BirthDate"))
myV = Convert.ToInt32(rdr("FooValue"))
如果数据实际存储为这些类型并且“装箱”为DBDataReader
的对象,则Convert
将正常工作。 (请注意,DBDataReaders可以直接返回类型化数据:n = rdr.GetInt32(1)
但您不能使用列名,只能使用序号位置。
CInt,CSng ......等
CInt
与Convert.ToInteger
类似,但根据MSDN优化用于VB。例如:
a = Convert.ToInt32("123.50") ' exception due to decimal point
a = CInt("123.50") ' a = 124
混淆?是的,但是一旦掌握了它们,就可以使用最适合这种情况的方法。无法为CInt
,CDec
等指定文化。
<强>缬氨酸强>
请勿使用Val
。永远。这是一个非常通用的函数,它返回Double
。使用它可能会导致各种不需要的类型转换:
Dim n = Val(tbSmallValue.Text)
n
创建为Double,如果文本框为“5”,则n
= 5.0
。当n
用于期望整数(例如插入数据库)时,可能会发生错误。结果差异很大:
dd = Val("123.4") ' = 123.4
dd = Val("$123.45") ' = 0.0
dd = Val("123abc") ' = 123.0
NB CInt
和Convert.ToInt32
实施“银行家舍入”,其中.50
分数四舍五入到最接近偶数。 123.50
和124.50
都围绕/转换为124
。