繁体   English   中英

为什么使用“私人子”而不是“公共子”

[英]why `Private Sub` instead of `Public Sub`

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

我有一个问题,为什么我们不使用Public Sub而不是Private Sub 可以从任何模块访问Public SubPrivate 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

决定是否全部使用“ Private不是Public取决于所声明内容的预期范围。 是的,使用带有Sub Public意味着可以在大多数地方引用该代码,这似乎是个好主意,但这样做可能会导致不良的结果。

例如,如果我将所有Sub都创建为Public ,则可能会无意间调用一个Sub ,该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

如您在上面的示例中看到的,我在fooBar类的所有Sub上使用了Public修饰符。 如果我在调用callThisSubFirst() setValue()方法之前先调用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那么当我试图在类外调用setValue()时,我将收到一条错误消息,指出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会导致应用程序出现问题的一个示例。 这样做还有很多其他原因,但都不是理想的解决方案,最大的原因是可维护性。 如果所有内容在一个类中都标记为Public ,并且需要对单个方法进行少量更改,则需要检查整个代码库,以确认该更改不会影响其他可能期望原始行为的调用方。 如果将方法或函数标记为“ Private开始,则唯一需要检查的代码是驻留在同一范围内的代码。

您似乎了解了公共私有之间的区别,这是一个好的开始。 是的,你可以使用公共 私人的地方可以使用,但是这并不一定是好事。 我认为同时使用这两种访问级别的主要原因是可维护性。 从类或模块外部可以访问的代码更改可能导致其他类和组件的其他更改。 通过在整个应用程序中引起多次更改,这会使代码修改变得复杂。 对私有例程的更改只能直接影响包含它的类或模块。 将例程设为私有可以防止其他开发人员直接使用它们。 这样一来,该类的开发人员就可以释放对私有代码的更改,而不必担心这可能会对其他开发人员产生不利影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM