none
[VB 2008]請問關於"Private" RRS feed

  • 問題

  • 關於Private的方法有點疑惑,想請教大家一下...
    模組中以Private宣告的變數,可在模組中的所有程序存取..
    如下
    Module Module1
        Private a1 As Integer = 10
        Sub Main()
            Console.WriteLine("變數 a1的值={0}", a1)
            Console.Read()
        End Sub
    
    End Module
    
    可在Main() 當中使用a1變數,然而當下面這個例子
    Module Module1
        Public Class Car
            Private mSpeed As Integer = 70
            Public Property Speed() As Integer
                Get
                    Return mSpeed
                End Get
                Private Set(ByVal Value As Integer)
                    mSpeed = Value
                End Set
            End Property
        End Class
    
        Sub Main()
            Dim BMW As New Car
            Console.WriteLine("現在速度 = {0}", BMW.Speed)
            BMW.Speed = 120    '屬性設定將產生錯誤
            Console.Read()
        End Sub
    
    End Module
    使用Private在模組層設定屬性值時,就不能在同一個模組下的 Main() 存取。
    
    因此關於Private的使用方法,我想問的是:
    
    (1)Private的存取範圍,什麼時候是可以在同一個模組層中的所有程序使用? 什麼時候不是?
    (2)如果在設定屬性時,希望能被同一個模組的所有程序使用,
       但不希望被其他模組使用時,該如何設定呢?
    
    新手提問,還請多多包含囉!
    謝謝幫忙!
    2009年5月22日 上午 11:19

解答

  • Module Module1
        Private Class Car '改為Private
            Private mSpeed As Integer = 70        
            Public Property Speed() As Integer
                Get
                    Return mSpeed
                End Get
                Set(ByVal Value As Integer'private刪除
                    mSpeed = Value
                End Set
            End Property
        End Class

        Sub Main()
            Dim BMW As New Car
            Console.WriteLine("現在速度 = {0}", BMW.Speed)
            BMW.Speed = 120    '上面的private刪除後,Error應該不會出現了
            Console.Read()
        End Sub

    End Module


    (1)Private的存取範圍,什麼時候是可以在同一個模組層中的所有程序使用? 什麼時候不是?
    如心冷大所述"Class 本身是封閉的,所以 Class 內的 Private 外面是看不到的。"
    因此本來你那樣寫
    你的屬性只有Class內部可以使用

    (2)如果在設定屬性時,希望能被同一個模組的所有程序使用,
       但不希望被其他模組使用時,該如何設定呢?
    整個Car Class設為Private

    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 吉米花 2009年5月26日 下午 04:41
    2009年5月24日 上午 02:15

所有回覆

  • Class 本身是封閉的,所以 Class 內的 Private 外面是看不到的。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月22日 下午 12:08
  • (2)如果在設定屬性時,希望能被同一個模組的所有程序使用,
       但不希望被其他模組使用時,該如何設定呢?
    小弟一些想法:參考一下,依照 2 所敘述和你的程式
       Public Class Car
           
    Private mSpeed As Integer = 70
           
    Public Property Speed() As Integer
                Get
                    Return mSpeed
               
    End Get
                Private Set(ByVal Value As Integer)
                    mSpeed = Value
               
    End Set
            End Property
        End Class
    你在模組裡有Class Car  ,屬性 Speed ,把屬性改成 ReadOnly ,mSpeed宣告放在模組下,是否就符合你 2 所敘述的方法了呢!!
    Module Module1
    Private mSpeed As Integer = 70
        Public Class Car
            Public ReadOnly Property Speed() As Integer
                'Set(ByVal Value As Integer)
                '    mSpeed = Value
                'End Set
                Get
                    Return mSpeed
                End Get
            End Property
        End Class
      Sub Main()
            Dim BMW As New Car
            Console.WriteLine("現在速度 = {0}", BMW.Speed)
            mSpeed = 120    '這行是在模組內改成直接設定直給mSpeed
            Console.Read()
        End Sub

    End Module
    當在模組外時只能讀取到 Car 的屬性 Speed,依照以上方法,在模組外都只能讀取而不能修改
    但在模組內你可直接改變 mSpeed ,當改變後就算在模組外在去 New 一個新的 Car ,所讀取的屬性 Speed 還是你在模組內改變的值喔~~~~~
    試試看吧!!!!
    有錯誤的話各位前輩請多指正........

    2009年5月23日 下午 05:03
  • Module Module1
        Private Class Car '改為Private
            Private mSpeed As Integer = 70        
            Public Property Speed() As Integer
                Get
                    Return mSpeed
                End Get
                Set(ByVal Value As Integer'private刪除
                    mSpeed = Value
                End Set
            End Property
        End Class

        Sub Main()
            Dim BMW As New Car
            Console.WriteLine("現在速度 = {0}", BMW.Speed)
            BMW.Speed = 120    '上面的private刪除後,Error應該不會出現了
            Console.Read()
        End Sub

    End Module


    (1)Private的存取範圍,什麼時候是可以在同一個模組層中的所有程序使用? 什麼時候不是?
    如心冷大所述"Class 本身是封閉的,所以 Class 內的 Private 外面是看不到的。"
    因此本來你那樣寫
    你的屬性只有Class內部可以使用

    (2)如果在設定屬性時,希望能被同一個模組的所有程序使用,
       但不希望被其他模組使用時,該如何設定呢?
    整個Car Class設為Private

    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 吉米花 2009年5月26日 下午 04:41
    2009年5月24日 上午 02:15
  • 謝謝"心冷熱情熄", "kevin 維", "蹂躪" 的回應
    
    不知可否再冒昧請教一下! 是否還有其他情況是像"Class"一樣是封閉的
    導致其內的private外面看不到?
    可否舉個常用的例子呢?
    
    抱歉因為這幾天比較忙所以較慢回應,另外真的很謝謝大家的幫忙 !
    
    2009年5月24日 下午 08:53
  • 請看線上手冊:
    Visual Basic 中的存留期 ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/bd91e390-690a-469a-9946-8dca70bc14e7.htm
    Visual Basic 中的範圍 ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/208106fe-79c9-4eec-93c6-55f08548895f.htm
    Visual Basic 中的存取層級 ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/6e06c1ab-fd78-47f0-83a8-1152780b5e1a.htm

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月25日 上午 03:48
  • Dear 心冷熱情熄
    
        謝謝你...那我可不可一問個小小的笨問題
        線上手冊該從哪進入啊 >.<
    2009年5月25日 下午 05:19
  • Google一下就有了
    Visual Basic 中的存留期 http://msdn.microsoft.com/zh-tw/library/35styb3a(VS.80).aspx
    Visual Basic 中的範圍 http://msdn.microsoft.com/zh-tw/library/1t0wsc67(VS.80).aspx
    Visual Basic 中的存取層級 http://msdn.microsoft.com/zh-tw/library/76453kax(VS.80).aspx

    http://www.dotblogs.com.tw/larrynung/
    2009年5月26日 上午 12:25
  • 你安裝軟體的話,若同時有安裝線上手冊,瀏覽的位置 (多選一):
    1. 直接在 IE 貼入該網址
    2. 在開發環境下按下 F1 ,會叫出線上手冊,可在網址列輸入該網址
    3. 開始工具列 下面目錄可找到,a, b, c 只差在起始頁不同,仍可在網址列輸入該網址
    a. Microsoft Developer Network / MSDN Library for Visual Studio 2008 SP1 繁體中文
    b. Microsoft Visual Studio 2008 / Microsoft Visual Studio 2008 文件
    c. Microsoft Visual Studio 2008 SDK / Microsoft Visual Studio 2008 SDK Documentation

    如果你在安裝軟體時沒安裝線上手冊,你只能去微軟 MSDN 網站看網路版。也就是蹂躪所說的,優點是省硬碟空間,缺點是慢、不好搜尋、不能設過濾條件等。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月26日 上午 04:03
  • Dear 心冷熱情熄
    謝謝你詳細的回應!
    感謝
    2009年5月26日 下午 04:40