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中的值然后保持冷静?
答案 0 :(得分:3)
想象一下,您正在搜索有
的程序中的错误通过这些自动转换,您可以为错误提供不必要的广阔空间。 另一方面,通过禁止自动转换,您可以强制程序员 思考 在他们放置它们的每个位置:
你能看到通过执行自动转换可以忽略多少事情以及可以产生多少错误?
即使使用显式转换调试代码通常也会更快,因为在自动转换后您可以认为:它是否正确完成?所以你可以感觉到你总是需要再检查一件事。因为自动转换比黑暗框更明显是转换。谁能记住它的所有行为?
考虑每次转换的各个方面(如上面的问题所示)并实施深思熟虑的决策(尽管通过明确的表示法)可以显着提高源代码的质量。这是大型应用的关键因素。
所以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
运算符。