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

时间:2015-11-05 22:20:15

标签: vb.net module

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

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

2 个答案:

答案 0 :(得分:3)

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

例如,如果我将Sub的所有Sub创建为Public,我可能会无意中调用依赖于那些不会产生的Sub的{​​{1}}运行时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

正如您在上面的示例中所看到的,我在类Public中的所有Sub上使用了fooBar修饰符。如果我在调用setValue()方法之前调用callThisSubFirst()方法,则会出现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()取决于正在执行的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,那么唯一需要检查的代码就是驻留在同一范围内的代码。

答案 1 :(得分:2)

您似乎理解 public private 之间的区别,这是一个良好的开端。是的,您可以使用 public ,只要私人可以使用,但这不一定是好事。我认为使用两种访问级别的主要原因是可维护性。对可从类或模块外部访问的代码的更改可能会导致对其他类和组件的其他更改。这可以通过在整个应用程序中引起多个更改来使代码修改复杂化对私有例程的更改只能直接影响包含它的类或模块。使例程私有化可防止其他开发人员直接使用它们。这使得类的开发人员可以对私有代码进行更改,而不必担心它可能会对其他开发人员产生负面影响。