1. 程式人生 > >變數和常量的有效範圍和同名問題

變數和常量的有效範圍和同名問題

這是我自己測試,並學習了網路材料後整理的結論。

參見msdn:高階變數主題,理解變數的範圍。

未測試類模組。未測試工程組。(請大家指正。)

首先,在“相同範圍”內(比如同一個過程中,同一個模組的宣告部分)不能兩次定義同名變數或常量(模組和其中的過程不是嚴格的“相同範圍”)。

其次,

1.窗體模組的宣告部分,
    對模組以外來說,
        定義的變數,
            如果是public定義的(不能用global),則可以被其他窗體和bas模組使用(讀取和賦值),但必須加上該窗體模組的名字。
            如果是private和dim定義的,則根本不能被其他窗體和bas模組使用。
        定義的常量,
            只能寫const或private const,根本不能被其他窗體和bas模組使用。
    對模組以內來說,
        對於該窗體內部的各過程來說,窗體模組的宣告部分定義的變數無論是public、private還是dim,以及定義的常量,都是相同的情況,即,如果各過程中先使用了這個變數、常量,那麼就不能在過程中再定義,但如果過程中還沒有使用這個變數、常量,就可以再定義同名變數、常量而使用,而互不干擾。

2.bas模組的宣告部分,
    對模組以外來說,
        定義的變數和常量,
            如果是global、public定義的,則可以被其他窗體和bas模組直接使用,但是“其他窗體和bas模組”必須沒有在宣告部分用任何語句定義過同名變數和常量,否則只能加上該bas模組的名字才能使用。如果有多個bas模組都定義了可直接使用的變數和常量,則直接使用時發生二義性錯誤。
            如果是private和dim定義的(常數不能用dim定義,只有const則相當於private const),則根本不能被其他窗體和bas模組使用。
    對模組以內來說,
        對於該bas模組內部的各過程來說,模組的宣告部分無論用何種語句定義的變數和常量,都是相同的情況,即,如果各過程中先使用了這個變數、常量,那麼就不能在過程中再定義,但如果過程中還沒有使用這個變數、常量,就可以再定義同名變數、常量而使用,而互不干擾。

3.在窗體模組、bas模組的各過程內部定義的,只能用dim、static定義變數,用const定義常量,只在該過程內部有效。過程內部(在用到這個變數常量時還)沒有定義的,則先去找本模組宣告部分定義的,如果還沒有,則去找其他bas模組宣告部分定義的而且可以對外直接使用的。找到以後就不能在過程中再定義同名變數。

4.事件過程的引數須依照事件本身的描述,不可改變。通用過程sub和函式function中的引數使用情況,第一、不能定義形參(虛參)。第二、對於形參的賦值不會改變傳值的實參(反過來說,如果sub、function中能夠對這個實參賦值,比如它是一個模組級變數、用其本身的名稱對其賦值,也不會影響對形參的計算),但能改變傳地址的實參(sub和function預設都是byref傳地址。如果實參是控制元件的屬性比如text1.text則不會變化,除非直接對其賦值)。第三、如果出現形參以外的引數名,則按上面一條中的順序去找引數的定義。

5.綜上所述,

①如果不希望各窗體、bas模組的變數和常量有任何互相影響的,則在各窗體、bas模組的宣告部分都用private定義變數和常量。(窗體的控制元件屬性只要加窗體名字就可以使用(讀取和賦值,如果可以賦值的話),和怎麼定義變數沒關係。)

②如果允許窗體變數被其他窗體和bas模組加窗體名字使用的,則在該窗體宣告部分用public定義變數。

③如果希望某個bas模組的變數常量直接被其他窗體和bas模組使用的(相當於“全域性變數”),則在該bas模組宣告部分應該用global、public來定義,而且其他窗體和bas模組的宣告部分和具體使用的過程中都沒有定義同名變數常量。

④如果希望模組內的某變數常量被模組內各過程使用的,則在該模組宣告部分用private、dim定義,而且具體使用的過程中都沒有定義同名變數常量。

⑤過程中類似於i、j、k、temp等迴圈變數、臨時變數,最好要麼只在模組的宣告部分用private、dim定義,要麼只在各過程開始的地方定義。

總的來說,應該儘量避免各處的變數常量、過程函式、控制元件同名。至少要意識到可能會有問題,這樣出現問題的時候容易找到原因。