为什么 `Private Sub` 而不是 `Public Sub`
why `Private Sub` instead of `Public Sub`
我搜索了 Private Sub
、Public Sub
和 Sub
之间的区别,以确保我必须使用什么。
我有一个问题,为什么我们不用 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
你似乎明白了public和private之间的区别,这是一个好的开始。是的,您可以在任何可以使用 public 的地方使用 public ,但这不一定是一件好事。我相信使用这两种访问级别的主要原因是可维护性。更改可从 class 或模块外部访问的代码可能会导致对其他 classes 和组件的其他更改。这会导致整个应用程序发生多次更改,从而使代码修改变得复杂。对私有例程的更改只能直接影响 class 或包含它的模块。将例程设为私有可防止其他开发人员直接使用它们。这使 class 的开发人员可以自由地更改私有代码,而不必担心它可能会对其他开发人员产生不利影响。
决定是否使用 Private
而不是 Public
都归结为声明的预期范围。是的,将 Public
与 Sub
一起使用意味着可以从大多数地方引用代码,这似乎是个好主意,但这样做可能会导致不良结果。
例如,如果我将我所有的 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
,那么唯一需要检查的代码就是位于同一范围内的代码。
我搜索了 Private Sub
、Public Sub
和 Sub
之间的区别,以确保我必须使用什么。
我有一个问题,为什么我们不用 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
你似乎明白了public和private之间的区别,这是一个好的开始。是的,您可以在任何可以使用 public 的地方使用 public ,但这不一定是一件好事。我相信使用这两种访问级别的主要原因是可维护性。更改可从 class 或模块外部访问的代码可能会导致对其他 classes 和组件的其他更改。这会导致整个应用程序发生多次更改,从而使代码修改变得复杂。对私有例程的更改只能直接影响 class 或包含它的模块。将例程设为私有可防止其他开发人员直接使用它们。这使 class 的开发人员可以自由地更改私有代码,而不必担心它可能会对其他开发人员产生不利影响。
决定是否使用 Private
而不是 Public
都归结为声明的预期范围。是的,将 Public
与 Sub
一起使用意味着可以从大多数地方引用代码,这似乎是个好主意,但这样做可能会导致不良结果。
例如,如果我将我所有的 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
,那么唯一需要检查的代码就是位于同一范围内的代码。