Partielle metoder i C# 3.0
En af de mindre kendte nyheder i C# 3.0 er partielle metoder. Partielle metoder er tænkt til at implementere letvægt events (callbacks) i forbindelse med kodegenerering. Designeren i LINQ to SQL er et af produkterne i Visual Studio 2008, som gør brug af kodegenerering og partielle metoder.
Så lad os lave en simpel LINQ to SQL model, som indeholder en Blog klasse med Id og Title properties.
LINQ to SQL genererer nu filen Blog.designer.cs som bl.a. indeholder vores Blog klasse.
public partial class Blog : INotifyPropertyChanging, INotifyPropertyChanged {
private int _Id;
private string _Title;
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnIdChanging(int value);
partial void OnIdChanged();
partial void OnTitleChanging(string value);
partial void OnTitleChanged();
#endregion
public Blog()
{
OnCreated();
}
[Column(Storage=”_Title”, CanBeNull=false)]
public string Title
{
get
{
return this._Title;
}
set
{
if ((this._Title != value))
{
this.OnTitleChanging(value);
this.SendPropertyChanging();
this._Title = value;
this.SendPropertyChanged(”Title”);
this.OnTitleChanged();
}
}
}
[Column(Storage=”_Id”, AutoSync=AutoSync.OnInsert, IsPrimaryKey=true)]
public int Id
{
…
}
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void SendPropertyChanging()
{
…
}
protected virtual void SendPropertyChanged(String propertyName)
{
…
}
}
Blog klassen har en region med partielle metoder (OnLoaded, OnCreated …) som bliver kaldt de steder i koden, hvor der ændres tilstand. F.eks. vil konstruktøren kalde den partielle metode OnCreated.
public Blog()
{
OnCreated();
}
Hvis vi bare bruger klassen uden selv at lave tilføjelser vil kompileren fjerne alle kald af partielle metoder. F.eks. vil konstruktøren reduceres til:
public Blog()
{
}
Hvilket jo er fornuftig, da vi ikke har defineren en krop til OnCreated metoden. Hvis vi er interesseret i at reagere på den hændelse som den partielle metode udtrykker, så må vi lave en partiel klasse udvidelse og definere metoden. F.eks.
public partial class Blog
{
partial void OnCreated()
{
Console.WriteLine(”Ny blog instans…”);
}
}
Der gælder flg. regler ved brug af partielle metoder:
- Partielle metoder kan ikke have en access-specifier. Partielle metoder er implicit erklæret som privat
- Retur-typen skal være void
- Supporterer ikke out parameter (ref og params er OK)
- Man kan ikke binde en delegate til en partiel metode med mindre den er defineret med krop
På et senere tidspunkt vil jeg skrive lidt mere om brug af partielle metoder og sammenligne dem med template method mønsteret fra GoF Design Pattern bogen.