簡體   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