为什么我们需要显式转换

时间:2015-08-09 19:55:34

标签: vb.net

   from yourapp.models import Profile

   def get_profile(request, user_id):
        context ={}
        profile = Profile.objects.filter(user=user_id)
        context['userprofile'] = profile
        return  render (request, 'your_template.html', context,)

如果上面的行Console.ReadLine返回String而Num是Integer那么显式转换的重要性是什么?为什么不是每次都接受所需DataType中的值然后保持冷静?

2 个答案:

答案 0 :(得分:3)

想象一下,您正在搜索有

的程序中的错误
  • 数千行代码
  • 10位撰稿人,其中5位不再提供
  • 字符串和数字之间的数百次自动转换

通过这些自动转换,您可以为错误提供不必要的广阔空间。 另一方面,通过禁止自动转换,您可以强制程序员 思考 在他们放置它们的每个位置:

  • 我需要转换。为什么?我真的在使用最合适的数据类型吗?
  • 输入是否包含会导致转换失败的字符?
  • 如果输入为空,空字符串或仅包含空格,该怎么办?
  • 如果输入的字符正确但是太长会怎么样?
  • 如果输入超出目标类型允许的值范围,该怎么办?
  • 如果客户的计算机切换到使用特定数字符号(不是0-9,但阿拉伯语或泰米尔语数字)的语言环境,转换是否仍然有效?
  • 我是否应该在指定地点或国家/地区使用不变格式,受所选语言环境的影响?
  • 如果此处转换失败,程序流程将继续? (例如,如果有例外。)

你能看到通过执行自动转换可以忽略多少事情以及可以产生多少错误?

即使使用显式转换调试代码通常也会更快,因为在自动转换后您可以认为:它是否正确完成?所以你可以感觉到你总是需要再检查一件事。因为自动转换比黑暗框更明显是转换。谁能记住它的所有行为?

考虑每次转换的各个方面(如上面的问题所示)并实施深思熟虑的决策(尽管通过明确的表示法)可以显着提高源代码的质量。这是大型应用的关键因素。

所以VB专业人士至少使用这两个选项:

Option Explicit On
Option Strict On

通常也是

Option Infer Off

通过这种方法,你在一开始就投入了更多的工作,这将在以后得到回报。正如史蒂夫在评论中所说,这取决于你是否想要专业。

答案 1 :(得分:2)

如果您知道正在发送的值是整数,则没有必要,但如果您不知道他真正输入的内容,那么创建一个CType以创建类型转换是很好的。例如:

 'OK
 Dim x As Int32 = "1246"
 'Error
 Dim y As Int32 = "ABC"

Visual Basic Parser自动将一种类型的值转换为另一种类型(Option Strict Off

 Dim A As Int32 = "3587"  'String type => Integer

 ' Automatically, the Parser will do this:
 Dim B As Int32 = CType("3587".ToString, Int32)

这是在每个结构或类中完成的,所有结构或类都有一个CType Narrow和Wide,它可以转换结构的类型,例如:

 Public Shared Widening Operator CType(ByVal a As String, ByVal b As Int32) As Int32
     Dim TMP% = a.ToString 'Cast
     Return CInt(TMP)
 End Operator

如果字符串是从一个整数派生而且可以转换,那么有一个布尔函数返回true,这将使你的代码免除许多Try...End Try

 Try
     Dim n As Int32 = "abc"
 Catch ex As Exception
     MsgBox("Invalid cast")
 End Try

 'replace with:

 Dim yourInput$ = "AbcDef447"
 Dim _yourInput$ = "3867"
 Dim myNum As Int32? = 0

 If IsNumeric(yourInput) Then
     Console.WriteLine("yourInput can be an integer.")
     myNum = yourInput
 ElseIf IsNumeric(_yourInput) Then
     Console.WriteLine("_yourInput can be an integer.")
     myNum = _yourInput
 Else
     Console.WriteLine("No one can be an integer.")
     GC.SupreessFinalize(myNum)
 End If

 'Output:
 '_yourInput can be an integer.
 'then finally: myNum is 3867.

无论如何,使用可以检查类型是否可以转换的方法总是好的,尝试使用TryParse方法(适用于所有类型,例如Int32.TryParse)或CType运算符。