要麼將工作,但對於語義正確的代碼,更願意通過值(ByVal
)傳遞。
當你按值傳遞的對象變量,你傳遞副本指針對象的。
那麼,什麼程序正在與是同一個對象(即改變屬性值將調用者可以看到),但它不能夠給Set
指針到別的東西 - 以及它可以,但它會在自己的副本上這樣做,因此呼叫者不會受到影響。
Public Sub DoSomething()
Dim target As Worksheet
Set target = ActiveSheet
Debug.Print ObjPtr(target)
DoSomethingElse target
Debug.Print ObjPtr(target)
End Sub
Private Sub DoSomethingElse(ByVal target As Worksheet)
Debug.Print ObjPtr(target)
Set target = Worksheets("Sheet12")
Debug.Print ObjPtr(target)
'in DoSomething, target still refers to the ActiveSheet
End Sub
在另一方面...
Public Sub DoSomething()
Dim target As Worksheet
Set target = ActiveSheet
Debug.Print ObjPtr(target)
DoSomethingElse target
Debug.Print ObjPtr(target)
End Sub
Private Sub DoSomethingElse(ByRef target As Worksheet)
Debug.Print ObjPtr(target)
Set target = Worksheets("Sheet12")
Debug.Print ObjPtr(target)
'in DoSomething, target now refers to Worksheets("Sheet12")
End Sub
一般而言,參數應按值傳遞。這只是一個不幸的語言怪癖ByRef
是默認的(VB.NET固定的)。
也是如此非對象變量:
Public Sub DoSomething()
Dim foo As Long
foo = 42
DoSomethingElse foo
End Sub
Private Sub DoSomethingElse(ByVal foo As Long)
foo = 12
'in DoSomething, foo is still 42
End Sub
而且......
Public Sub DoSomething()
Dim foo As Long
foo = 42
DoSomethingElse foo
End Sub
Private Sub DoSomethingElse(ByRef foo As Long)
foo = 12
'in DoSomething, foo is now 12
End Sub
如果一個變量是通過引用傳遞,但在過程的主體是永遠不會重新分配,那麼它可以通過值傳遞。
如果變量通過引用傳遞,並重新分配它在一個過程的主體,則該程序可有可能被寫爲一個Function
,實際上返回修改後的值來代替。
如果一個變量是按值傳遞的,並且在過程的主體中被重新分配,那麼調用者不會看到變化 - 這會使代碼變得可疑;如果一個程序需要重新分配ByVal
參數值,如果它定義了自己的局部變量和分配代碼的意圖逐漸明朗的是中代替ByVal
參數:
Public Sub DoSomething()
Dim foo As Long
foo = 42
DoSomethingElse foo
End Sub
Private Sub DoSomethingElse(ByVal foo As Long)
Dim bar As Long
bar = foo
'...
bar = 12
'...
End Sub
這些都是實際代碼檢查在Rubberduck,因爲VBE插件,我積極參與了,可以分析你的代碼,看到這些東西:
參數通過值傳遞,但被分配了新的值/引用。如果調用者不應該知道新值,請考慮製作本地副本。如果調用者應該看到新的值,那麼該參數應該傳遞給ByRef,而你有一個錯誤。
http://rubberduckvba.com/Inspections/Details/AssignedByValParameterInspection
僅具有一個參數由在程序退出之前分配一個新的值/參考引用傳遞的過程中,使用ByRef參數作爲返回值:考慮將其作爲一個函數。
http://rubberduckvba.com/Inspections/Details/ProcedureCanBeWrittenAsFunctionInspection
,其通過引用傳遞和沒有被分配一個新的值/參考的參數,可以通過值替代地通過。
http://rubberduckvba.com/Inspections/Details/ParameterCanBeByValInspection
這就是wsReport
這裏的情況:
這可能有助於http://www.windowsdevcenter.com/pub/a/oreilly/windows/ ron/objects.html –