[英]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
决定是否全部使用“ 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.