Entries Comments



Category: C#

Partielle metoder i C# 3.0

19 December, 2007 (10:03) | C# | By: Kim Harding

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.

image

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.

Slides til "En dag med LINQ"

18 December, 2007 (21:20) | C#, Foredrag, LINQ | By: Kim Harding

Tak til alle som mødte op til "En dag med LINQ" foredragene i Århus og København!

Hvis du er interesseret i slides og eksempler kan du hente dem her.

Mange af eksemplerne er skrevet som unit tests. Som jeg nævnte på foredraget, så bruger jeg det nye xUnit.net test-framework. xUnit.net er lavet at James Newkirk, der også er ophavsmand til NUnit. xUnit.net kan integreres i Visual Studio vha. TestDriven.net.

Jeg har ikke inkluderet koden til det Domain Driven Design framework jeg benyttede i "VideoStore" eksemplet i den sidste session. Når frameworket er blevet mere modent vil jeg sandsynligvis gøre det til open-source. Hvis jeg kan kontrollere mit risalamande indtag i juledagene, så vil jeg skrive lidt på blog’en om de ideer og tricks, der ligger bag.