【发布时间】:2010-09-30 05:51:30
【问题描述】:
基本上,我在大部分日常编程任务中都使用了Integer.Parse 和CInt,但我对两者之间的区别有点困惑。
VB.NET 中Integer.Parse 和CInt 有什么区别?
【问题讨论】:
标签: vb.net
基本上,我在大部分日常编程任务中都使用了Integer.Parse 和CInt,但我对两者之间的区别有点困惑。
VB.NET 中Integer.Parse 和CInt 有什么区别?
【问题讨论】:
标签: vb.net
CInt 比Integer.Parse 做得更多。
CInt 将首先检查传递的是否是整数,然后简单地转换并返回它。如果它是双精度数,它将尝试在不先将双精度数转换为字符串的情况下进行转换。
请参阅CInt 和其他Type Conversion Functions 的帮助
小数部分。当你转换一个 整数类型的非整数值, 整数转换函数 (CByte、CInt、CLng、CSByte、CShort、 CUInt、CULng 和 CUshort)删除 小数部分并将值四舍五入为 最接近的整数。
如果小数部分正好是 0.5, 整数转换函数轮 它到最接近的偶数。为了 例如,0.5 轮到 0,以及 1.5 和 2.5 都舍入到 2。这有时称为庄家舍入,其 目的是补偿偏差 添加许多时可能会累积 这些数字加在一起。
简而言之,它不仅仅是将字符串转换为整数,例如对分数应用特定的舍入规则,缩短不必要的转换等。
如果您正在将字符串转换为整数,请使用Integer.Parse(或Integer.TryParse),如果您要强制转换未知值(例如来自数据库的variant 或object)为整数,使用CInt。
【讨论】:
DirectCast 或 TryCast 将另一种类型强制(强制转换)为整数。我避免 CInt 正是因为它非常灵活,恕我直言,它掩盖了代码的意图。
DirectCast 或TryCast 都不会将字符串转换为整数,它们必须有继承关系才能工作。也许您正在考虑TryCast,它将使用与CInt相同的规则将对象强制为整数。
CInt。您写道“如果您要将字符串转换为整数,请使用*Parse”。同意。然后我建议,如果你是从整数类型开始(强制转换),只需使用*Cast。如果您真的不知道您是从整数类型还是字符串类型开始,请仅使用CInt。最后一种情况应该是非常罕见的——从某种弱类型的数据存储中获取变体或对象,这些数据存储以无纪律的方式使用>
使用ILDASM 查看一些示例代码,您可以看到 CInt 已转换为此调用:
Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToInteger(string)
使用.NET Reflector,可以提取这段代码:
Public Shared Function ToInteger(ByVal Value As String) As Integer
Dim num As Integer
If (Value Is Nothing) Then
Return 0
End If
Try
Dim num2 As Long
If Utils.IsHexOrOctValue(Value, (num2)) Then
Return CInt(num2)
End If
num = CInt(Math.Round(Conversions.ParseDouble(Value)))
Catch exception As FormatException
Throw New InvalidCastException(Utils.GetResourceString("InvalidCast_FromStringTo", New String() { Strings.Left(Value, &H20), "Integer" }), exception)
End Try
Return num
End Function
您可以看到它在内部调用了 Conversions.ParseDouble。
因此,正如 Binary Worrier 所述,使用 Integer.Parse 进行字符串强制转换,仅使用 CInt 进行强制转换。
【讨论】:
这是一个真正的区别: Integer.parse("1.00") 会抛出错误。 CInt("1.00") 会起作用
【讨论】:
<Data Type>.Parse 方法用于从表示该值的字符串中提取该类型的值(例如,“2”中的 2)C<Data Type> 函数对表达式进行操作并返回一个变体子类型为所需类型(例如CInt("2")或CInt(SomeDouble + SomeDouble)等)。
【讨论】: