The standard way would be to use a Private variable and a Public ReadOnly property. That's how just about every collection property in the Framework is structured. That way you can get a reference to the collection from outside so you can get the items and modify the collection but you cannot assign a whole new collection in its place:
VB Code:
Private myField As ArrayList
Public ReadOnly Property MyProperty() As ArrayList
Get
If Me.myField Is Nothing Then
Me.myField = New ArrayList
End If
Return Me.myField
End Get
End Property
If you don't want the caller to be able to modify the collection then you should return an array containing the items instead of a reference to the collection:
VB Code:
Private myField As ArrayList
Public ReadOnly Property MyProperty() As Object()
Get
If Me.myField Is Nothing Then
Me.myField = New ArrayList
End If
Return Me.myField.ToArray()
End Get
End Property
Note that this creates a completely new array object each time the property is accessed so it should be done as infrequently as possible.