Differentierede access modifiers  

Når man definerer en property genereres der metoder, der kaldes ved læsning henholdsvis skrivning af property’en. Indholdet af disse genererede metoder definerer udvikleren ved at definere en get henholdsvis en set blok for property’en som eksemplificeret ved nedenstående simple eksempel:

Private _navn As String

Public Property Navn() As String
  Get
    Return _navn
  End Get
  Set(ByVal Value As String)
    _navn = Value
  End Set
End Property
private string _navn;
public string Navn
{
  get
  {
    return _navn;
  }
  set
  {
    _navn = value;
  }
}

De for denne property genererede metoder vil være:

Public Function get_Navn() As String
  Dim s As String
  s = Me._navn
  Return s 
End Function

Public Sub set_Navn(ByVal Value As String)
  Me._navn = Value
End Sub
public string get_Navn()
{
  string text1;
  text1 = this._navn;
  return text1;
}

public void set_Navn(string value)
{
  this._navn = value;
}

Når man i Visual Studio 2003 definerer en property, kan man angive en access-modifier (public, private, friend/internal eller protected). Denne access-modifier vil efterfølgende gælde for begge de genererede metoder (get_Navn og set_Navn) – eller sagt med andre ord: Man kan i VS 2003 ikke angive forskellige access-modifiers for get- og set-blokkene i en property definition.

I Visual Studio 2005 har man til gengæld netop fået mulighed for at definere forskellige access-modifiers for get- og set-blokkene for en property. Man definerer kun access modifieren eksplicit på den ene blok, den anden blok benytter den access-modifier, der overordnet er defineret på property’en. Så man definerer altså en access-modifier på property’en som sådan og for enten get- eller set-blokken kan man vælge at definere en mere begrænset access-modifier. Det følgende eksempel definerer en property, som kun kan ændres fra den assemply, hvori Person-klassen er placeret:

Public Class Person
  Private _navn As String
  Public Property Navn() As String
    Get
      Return _navn
    End Get
    Friend Set(ByVal value As String)
      _navn = value
    End Set
  End Property
End Class
public class Person
{
  private string _navn;
  public string Navn
  {
    get
    {
      return _navn;
    }
    internal set
    {
      _navn = value;
    }
  }
}

Specielt nyttigt er det i de tilfælde, hvor man ønsker at en property kan læses af alle, men kun subklasser må få adgang til at sætte propertyens værdi (og skal faktisk gøre det). Ved at gøre Set-blokken protected kan man lade subklasser benytte denne og state kan dermed nemmere opdateres korrekt.