Vb.net 在If语句中声明时如何将变量的作用域限制为函数
我需要将变量的作用域限制在它所驻留的函数中,但是我需要在if语句中声明它,因为它的类型将随时间而变化。我在VB.NET中工作Vb.net 在If语句中声明时如何将变量的作用域限制为函数,vb.net,scope,Vb.net,Scope,我需要将变量的作用域限制在它所驻留的函数中,但是我需要在if语句中声明它,因为它的类型将随时间而变化。我在VB.NET中工作 Public Function CourseDataTable() If RadioCourses.Checked Then Dim SearchBy As New classSearchCourses ElseIf RadioAttendees.Checked Then Dim SearchBy As New classS
Public Function CourseDataTable()
If RadioCourses.Checked Then
Dim SearchBy As New classSearchCourses
ElseIf RadioAttendees.Checked Then
Dim SearchBy As New classSearchAttendees
End If
明显的问题是,该变量不能在if语句之外持久存在。我想限制这个变量的作用域,因为a,它用在其他地方,b,内存泄漏,这个类很可能最终保存整个SQL表,我不希望在不需要的时候持久化。
我不能在这里使用继承或变形,因为我使用的是遗留系统
这可能是一次返工(我很难想出一种不同的方法来处理它),因为我在MSDN中找不到任何允许过程范围但在声明时忽略任何其他块的东西。在遗留系统中仍然可以使用多态性。您可以做的是找到两者之间必须存在的公共功能,以便您甚至希望重用相同的变量。然后,您可以为这些遗留类中的每一个创建包装类。包装器类将实现公共接口,并简单地调用底层遗留实现。然后,您只需向该公共接口声明一个变量,并在if语句中创建适当的包装类实例
编辑:如果您能够修改遗留类,一个更简单的解决方案是创建一个公共接口,这两个遗留类都可以实现。这将为您提供所需的多态功能,而无需包装器类。Net甚至提供了以一种方式实现接口的能力,其中接口方法仅通过接口引用公开。为此,只需将接口实现方法标记为私有。在遗留系统中仍然可以使用多态性。您可以做的是找到两者之间必须存在的公共功能,以便您甚至希望重用相同的变量。然后,您可以为这些遗留类中的每一个创建包装类。包装器类将实现公共接口,并简单地调用底层遗留实现。然后,您只需向该公共接口声明一个变量,并在if语句中创建适当的包装类实例
编辑:如果您能够修改遗留类,一个更简单的解决方案是创建一个公共接口,这两个遗留类都可以实现。这将为您提供所需的多态功能,而无需包装器类。Net甚至提供了以一种方式实现接口的能力,其中接口方法仅通过接口引用公开。为此,只需将接口实现方法标记为Private。您可以将
SearchBy
声明为Object
,然后执行类似操作
Dim searchBy As Object
If RadioCourses.Checked Then
searchBy = New classSearchCourses
ElseIf RadioAttendees.Checked Then
searchBy = New classSearchAttendees
End If
If searchBy.GetType() Is GetType(classSearchCourses) Then
'Do something
ElseIf searchBy.GetType() Is GetType(classSearchAttendees) Then
'Do something else
End If
虽然这仍然是继承,因为大多数东西都是从System.Object继承的,但如果由于某种原因您不能声明自己的新基类,它将节省您的时间您可以将
SearchBy
声明为对象
,然后执行类似的操作
Dim searchBy As Object
If RadioCourses.Checked Then
searchBy = New classSearchCourses
ElseIf RadioAttendees.Checked Then
searchBy = New classSearchAttendees
End If
If searchBy.GetType() Is GetType(classSearchCourses) Then
'Do something
ElseIf searchBy.GetType() Is GetType(classSearchAttendees) Then
'Do something else
End If
虽然这仍然是继承,因为大多数东西都是从System.Object继承的,但如果由于某种原因您不能声明自己的新基类,这将节省您的时间如果此变量仅存在于此函数中,则只需创建一个新变量,并在使用完它后正确处理它。是否继承类(或实施)与任何一个普通函数相比?使用两个完全不同的函数可能更简单,而不是使用大量的长IF块。您的a点和b点更多地是关于它的编码方式,而不是变量的声明位置/方式。@PUROTIX对此只有三个IF块,但实际函数的长度超过200行。如果此变量仅用于存在于该函数中,然后只需创建一个新变量,并在使用完该变量后正确处理它。您的类继承(或实现)了吗从任何一个普通的函数开始?使用两个完全不同的函数可能比使用大量的长IF块更简单。你的a点和b点更多地是关于它是如何编码的,而不是变量是如何声明的。@PUROTIX这个函数只有三个IF块,但实际函数超过200行。这正是我需要的:)我相信下面的方法也有效。如果searchBy的类型是classSearchCourses.Yeah,那么@Scott也应该可以,而且实际上可读性更好:)这正是我需要的:)我相信下面的方法也可以。如果searchBy的类型是classSearchCourses.Yeah,那么@Scott也应该可以,而且实际上可读性更高:)答案不错,但是另一个更好,因为它只增加了一行,不需要太多思考。当然,另一个答案肯定有效,但我倾向于更多地依赖类型系统,而不是求助于对象引用。要使用对象引用,您可能需要关闭Option Strict(不推荐),或者必须执行运行时类型检查和强制转换。添加公共接口会将类型检查移动到编译时,因此您可以对代码更有信心。它还允许您在其他地方重用接口,而无需进行相同的类型检查。答案很好,但另一个答案更可取,因为它只添加了一行,不需要太多考虑。当然,另一个答案肯定有效,但我倾向于更多地依赖类型系统,而不是求助于对象引用。要使用对象引用,您可能需要关闭Option Strict(不推荐),或者必须执行运行时类型检查和强制转换。添加公共接口会将类型检查移动到com