我搜索了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
答案 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 ,只要私人可以使用,但这不一定是好事。我认为使用两种访问级别的主要原因是可维护性。对可从类或模块外部访问的代码的更改可能会导致对其他类和组件的其他更改。这可以通过在整个应用程序中引起多个更改来使代码修改复杂化对私有例程的更改只能直接影响包含它的类或模块。使例程私有化可防止其他开发人员直接使用它们。这使得类的开发人员可以对私有代码进行更改,而不必担心它可能会对其他开发人员产生负面影响。