.NET Features: auto properties

Door Luuk1983 op dinsdag 21 juni 2011 14:44 - Reacties (9)
Categorie: Programmeren, Views: 2.671

Als .NET-programmeur merk ik regelmatig dat andere programmeurs niet op de hoogte zijn van sommige handige en slimme features in het .NET framework die het programmeren een stuk makkelijker kunnen maken. Soms zijn deze features verstopt, of soms zijn ze pas nieuw, maar handig zijn ze altijd. Dit is deel 2 van een serie met kleine voorbeelden van features die je als .NET-programmeur (met name in C#) mogelijk nog niet kent. Deze keer: auto properties in C#.

In het algemeen is het goed gebruik dat als je variabelen wilt ontsluiten gebruik te maken van public properties (naast functions natuurlijk) en geen public variabelen. Het was altijd veel werk om publieke properties te maken, omdat je dan altijd een achterliggende private variabele moest declareren om de waarde in vast te houden. Hoewel je met de refactor optie van Visual Studio niet alles helemaal zelf hoefde uit te typen, was het toch omslachtig.

Dit hoeft sinds .NET3.5/Visual Studio 2008 niet meer. Dit geldt overigens alleen voor 'simpele' properties waar je alleen een waarde aan wil kunnen toekennen en uitlezen. Als je meer dan dat wilt, dan gaat onderstaand verhaal niet op.

Voorheen moest je properties zo declareren:

C#:
1
2
3
4
5
6
7
8
9
10
public class Foo
{
    private int _anIntegerValue;

    public int AnIntegerValue
    {
        get { return _anIntegerValue; }
        set { _anIntegerValue = value; }
    }
}


Sinds .NET3.5/Visual Studio 2008 kan het veel korter:

C#:
1
2
3
4
public class Foo
{
    public int AnIntegerValue { get; set; }
}


Je hoeft niet perse meer een achterliggende private variabele aan te maken, dat gebeurt automatisch.

Overigens kan je de get en set nog steeds andere access-modifiers geven:

C#:
1
2
3
4
public class Foo
{
    public int AnIntegerValue { get; private set; }
}


(dank CyCloneNL voor de toevoeging)

Je mag niet alleen de get of de set expliciet implementeren en de ander impliciet. Dit kan dus niet:

C#:
1
2
3
4
5
6
7
8
9
10
public class Foo
{
    private int _anIntegerValue;

    public int AnIntegerValue
    {
        get;
        set { _anIntegerValue = value; }
    }
}



Maar nogmaals: dit verhaal geldt alleen voor 'simpele' properties, als je meer wilt dan een waarde opslaan en ophalen, dan heb je meer nodig dan bovenstaand verhaal.

Hopelijk hebben jullie er wat aan! Suggesties zijn altijd welkom.

Volgende: .NET Features: Object Initializer 06-'11 .NET Features: Object Initializer
Volgende: .NET features: Optional Parameters 06-'11 .NET features: Optional Parameters

Reacties


Door Tweakers user TJHeuvel, dinsdag 21 juni 2011 14:56

Wellicht is het handig toe te voegen dat je de set en get andere access-modifiers kan geven.
Dus:

C#:
1
public int AnInt { get; private set; }

[Reactie gewijzigd op dinsdag 21 juni 2011 14:56]


Door Tweakers user kipusoep, dinsdag 21 juni 2011 15:16

En dat je met het typen van prop > tab > tab deze dingen wel heeeeel makkelijk kunt aanmaken ;)

Door Tweakers user TJHeuvel, dinsdag 21 juni 2011 15:18

Nog eentje, aan de hand van je toevoeging:
`Je mag niet alleen de get of de set declareren en de ander niet. `

Misschien interpeteer ik het verkeerd, maar dit mag wel:

C#:
1
2
3
4
5
6
7
public int AnInt 
{ 
 get 
 {  
  return 9;
 }
}


Volgens mij bedoel je dat je er niet 1 mag implementeren, maar wel maar 1 mag declareren ;)

[Reactie gewijzigd op dinsdag 21 juni 2011 15:19]


Door Tweakers user Luuk1983, dinsdag 21 juni 2011 15:19

CyCloneNL schreef op dinsdag 21 juni 2011 @ 15:18:
Nog eentje, aan de hand van je toevoeging:
`Je mag niet alleen de get of de set declareren en de ander niet. `

Misschien interpeteer ik het verkeerd, maar dit mag wel:

C#:
1
2
3
4
5
6
7
public int AnInt 
{ 
 get 
 {  
  return 9;
 }
}


Volgens mij bedoel je dat je er niet 1 mag implementeren, maar wel maar 1 mag declareren ;)
Aangepast :) Ik bedoelde inderdaad het laatste wat je zei

[Reactie gewijzigd op dinsdag 21 juni 2011 16:14]


Door Tweakers user Styxxy, dinsdag 21 juni 2011 17:21

En voor auto propertie met private set, propg > tab > tab ;).

Door Tweakers user RobIII, dinsdag 21 juni 2011 18:56

Niet om je 't gras voor de voeten weg te maaien hoor, helemaal niet, maar kijk ook even hier :P Toevallig haal ik daar ook autoimplemented properties aan :Y)

[Reactie gewijzigd op dinsdag 21 juni 2011 18:57]


Door Tweakers user Luuk1983, dinsdag 21 juni 2011 19:04

RobIII schreef op dinsdag 21 juni 2011 @ 18:56:
Niet om je 't gras voor de voeten weg te maaien hoor, helemaal niet, maar kijk ook even hier :P Toevallig haal ik daar ook autoimplemented properties aan :Y)
Geen probleem hoor :) Ik kom af en toe van die dingen tegen die veel mensen niet kennen. En ik was op zoek naar goede onderwerpen voor blogs waar mensen nog wat aan hebben :) Object Initializers komen in de volgende blog aan bod toevallig (deze heb ik al klaar staan, maar ik wil niet TE snel blogs uitbrengen). Ik zie in jouw blog inderdaad nog een paar dingen die inderdaad ook erg handig zijn. Mogelijk dat ik nog wat dingen van je leen, maar ik zal netjes een bronverwijzing erbij plaatsen.

Door Tweakers user RobIII, woensdag 22 juni 2011 00:46

Luuk1983 schreef op dinsdag 21 juni 2011 @ 19:04:
Mogelijk dat ik nog wat dingen van je leen
:( IK SLEEP JE VOOR DE RECHTER!!!!!111

:+ Nee joh; sure. Go ahead. :> Knock yourself out ;)


Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)