Another decision around whether to use properties or functions is when instantiating the parent object. VB has that wonderfully convenient syntax, e.g.
Dim MyStudent as Student With {.Name = "Bobby", .Age = 10}
Only properties are available in the With section.
I maintain an app which has a lot of persisted objects in a database, which a lot of relationships between objects. e.g. a student has a teacher, and the teacher is peristed in the DB.
I typically use a WriteOnly property to set the Teacher, since this is a light operation, but given there is potentially expensive DB access to retrieve the Teacher, I use a function to retrieve. In other words:
Public Writeonly Property Teacher() as Teacher
Public Function GetTeacher() as Teacher
This lets me instantiate a Student in the form With {.Teacher = SomeTeacherObject}
but GetTeacher encourages caching of the Teacher object in user code and not just using it as a Property which may or may not result in multiple DB access calls.
If anyone has any comments on this approach I would love to hear them.