为什么 `Private Sub` 而不是 `Public Sub`

why `Private Sub` instead of `Public Sub`

我搜索了 Private SubPublic SubSub 之间的区别,以确保我必须使用什么。

我有一个问题,为什么我们不用 Public Sub 而不是 Private SubPublic Sub可以从任何模块访问而Private Sub只限于这个小地方

文件 1:

Module ModuleA
    Public Sub Test()
        messagebox.show("Message from Public Sub")
    End Sub
End Module

文件 2:

Module ModuleB
    Private Sub Run_Public_Sub Handles Button.Click
        Test()
    End Sub
End Module

你似乎明白了publicprivate之间的区别,这是一个好的开始。是的,您可以在任何可以使用 public 的地方使用 public ,但这不一定是一件好事。我相信使用这两种访问级别的主要原因是可维护性。更改可从 class 或模块外部访问的代码可能会导致对其他 classes 和组件的其他更改。这会导致整个应用程序发生多次更改,从而使代码修改变得复杂。对私有例程的更改只能直接影响 class 或包含它的模块。将例程设为私有可防止其他开发人员直接使用它们。这使 class 的开发人员可以自由地更改私有代码,而不必担心它可能会对其他开发人员产生不利影响。

决定是否使用 Private 而不是 Public 都归结为声明的预期范围。是的,将 PublicSub 一起使用意味着可以从大多数地方引用代码,这似乎是个好主意,但这样做可能会导致不良结果。

例如,如果我将我所有的 Sub 创建为 Public,我可能会无意中调用依赖于某些不存在的东西的 Sub,这将导致NullReferenceException 在运行时。请参阅以下示例:

Class fooBar
    Private Property myPrivateProperty As String
    Public Property myPublicProperty As String
    Public Property myValue As String

    Public Sub New()
        myPublicProperty = "Hello"
    End Sub

    Public Sub callThisSubFirst()
        myPrivateProperty = "World"
        setValue()
    End Sub

    Public Sub setValue()
        myValue = myPublicProperty.ToUpper & myPrivateProperty.ToUpper
    End Sub
End Class

正如您在上面的示例中看到的,我在 class fooBar 中的所有 Sub 上都使用了 Public 修饰符。如果我在调用 callThisSubFirst() 方法之前调用 setValue() 方法,则会出现 NullReferenceException,因为我试图在字符串对象上调用 .ToUpper 字符串扩展未实例化。

Sub Main()
    Dim test As New fooBar
    test.setValue() ' NRE will occur here
    Console.WriteLine(test.myValue)
End Sub

应该发生的是 callThisSubFirst() 方法应该被调用以实例化 myPrivateProperty 并且只有在那之后才应该调用 setValue() 方法。如果我将 setValue() 方法标记为 Private,那么当我试图在 class 之外调用它时,我会收到一条错误消息,指出 setValue() 在上下文中不可用];这正是需要发生的事情,因为 setValue() 取决于正在执行的 callThisSubFirst() 方法。代码应该是这样写的:

Class fooBar
    Private Property myPrivateProperty As String
    Public Property myPublicProperty As String
    Public Property myValue As String

    Public Sub New()
        myPublicProperty = "Hello"
    End Sub

    Public Sub callThisSubFirst()
        myPrivateProperty = "World"
        setValue()
    End Sub

    Private Sub setValue()
        myValue = myPublicProperty.ToUpper & myPrivateProperty.ToUpper
    End Sub
End Class

下面是它应该如何使用:

Sub Main()
        Dim test As New fooBar
        test.callThisSubFirst() ' Hurray, no exceptions!
        Console.WriteLine(test.myValue)
End Sub

这只是将所有内容标记为 Public 会如何导致您的应用程序出现问题的一个示例。这样做也是一个不太理想的解决方案的原因有很多,其中最大的原因是可维护性。如果所有内容都在 class 中标记为 Public 并且需要对单个方法进行小的更改,则需要检查整个代码库以确认更改不会影响任何其他方法可能期望原始行为的调用者。如果方法或函数一开始就被标记为 Private,那么唯一需要检查的代码就是位于同一范围内的代码。