Vb.net 在If语句中声明时如何将变量的作用域限制为函数

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

我需要将变量的作用域限制在它所驻留的函数中,但是我需要在if语句中声明它,因为它的类型将随时间而变化。我在VB.NET中工作

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