2008-02-19

C# 3.0: Automatiskt implementerade egenskaper

Jag tänkte jag skulle beskriva lite om nyheterna i C# 3.0. Det finns väl en hel del av dessa beskrivningar ute på nätet nu, men jag har inte sett någon riktigt bra på svenska som gått lite mer på djupet.

Först ut är automatiskt implementerade egenskaper (eng. auto-implemented properties).

C# 2.0

I C# 2.0 skrivs properties så här:

private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}



C# 3.0


Självklart kan du fortsätta skriva properties på samma sätt som i 2.0, men eftersom många properties är just enkla hämta-lagra-ett-värde så finns det i C# 3.0 ett mer kompakt sätt att skriva ovanstående på.

public string Name { get; set; }

Båda varianterna är i princip ekvivalenta. Kompilatorn kommer automatiskt att generera en privat variabel, som sen används på samma sätt som _name. Den lägger dessutom till attributet CompilerGenerated för att markera att get- och set-metoderna är genererade av kompilatorn.


Sidospår: En property består i själva verket av en get-metod och en set-metod. Så Name har en metod: string get_Name() och en void set_Name(string value). Det är båda dessa som markeras med attributet CompilerGenerated.


På samma sätt som i 2.0 kan man ange private/protected på set för att göra en, utifrån sett, read-only property:

public string Name { get; private set; }
public string Name2 { get; protected set; }

Observera att man måste ha både get och set. Så följande är inte tillåtet:


public string Name { get; }
public string Name2 { set; }

Varför ska man kunna hämta ett värde när man inte kan sätta det, och vice-versa?


Tips: I Visual Studio skapar man properties enklast genom att skriva prop och trycka tab två gånger.


Läs mer


Kortfattad summering:
http://msdn2.microsoft.com/en-us/library/bb384054.aspx
Scott Guthrie förklarar:
http://weblogs.asp.net/scottgu/archive/2007/03/08/new-c-orcas-language-features-automatic-properties-object-initializers-and-collection-initializers.aspx
Detaljerna kring vad som händer under skalet:
http://community.bartdesmet.net/blogs/bart/archive/2007/03/03/c-3-0-automatic-properties-explained.aspx