Avatar billede olehaahr Nybegynder
29. marts 2012 - 20:32 Der er 10 kommentarer og
1 løsning

Pæneste måde at initiere variable på ?

Hej,

Hvad er pænest / best practice i c#, når variable skal initieres?

public class Class1
{
  private int _a = 10;

  public int A
  {
      get { return _a; }
      set { _a = value; }
  }
}

ELLER:

public class Class2
{
    private int _a;

    public Class2()
    {
        _a = 10;
    }

    public int A
    {
        get { return _a; }
        set { _a = value; }
    }
}

Mvh Ole
Avatar billede Slettet bruger
29. marts 2012 - 20:37 #1
Jeg foretrækker den første, og hvis du har flere constructors der alle skal initialisere den med samme værdi, så skal du kun ændre værdien et sted, hvis den pludselig skal have en anden værdi.
Avatar billede arne_v Ekspert
29. marts 2012 - 20:55 #2
En tredie mulighed siden 2005 er:

public class Class3
{
    public Class3()
    {
        A = 10;
    }

    public int A { get; set; }
}
Avatar billede arne_v Ekspert
29. marts 2012 - 20:58 #3
Jeg tror at de fleste ville vaelge #3 idag.

Hvis valget er mellem #1 og #2, saa vil jeg lade det afhaenge af om a er core logic eller plumbing.

Jeg kan lide at constructors saetter det som er core logic og det som er plumbing saettes inline. Paa den maade vil man ved laesning af constructor kunne fokusere paa det vigtige.

get og set exposing antyder at der er core logic og ikke plumbing.
Avatar billede arne_v Ekspert
29. marts 2012 - 20:59 #4
For at undgaa duplikat i multiple construktorer vil jeg lade dem kalde hinanden.
Avatar billede olehaahr Nybegynder
29. marts 2012 - 21:09 #5
Metode 3 bruger jeg selv, hvis det er muligt, så det giver mindst mulig kode. Kan bare ikke altid bruges, som i nedenstående tilfælde.

Men som jeg forstår jeres indlæg, så er der principielt ingen forskel på de 2 metoder ?



public class Class1
    {
        private List<string> _a = new List<string>();

        public List<string> A
        {
            get { return _a; }
            set { _a = value; }
        }
    }

    public class Class2
    {
        private List<string> _a;

        public Class2()
        {
            _a = new List<string>();
        }

        public List<string> A
        {
            get { return _a; }
            set { _a = value; }
        }
    }


    public class Class3 //Duer ikke...
    {
        public List<string> A { get; set; }
    }
Avatar billede arne_v Ekspert
29. marts 2012 - 21:13 #6
public class Class4
    {
        private List<string> _a = new List<string>(); // the list is plumbing not core logic

        public List<string> A
        {
            get { return _a.AsReadOnly(); } // encapsulation !!!!
        }
    }
Avatar billede arne_v Ekspert
29. marts 2012 - 21:15 #7
Hvis du ikke vil encapsulate saa er:

public class Class3
    {
        public Class3()
        {
            A = new List<string>();
        }
        public List<string> A { get; set; }
    }

vel OK??
Avatar billede olehaahr Nybegynder
29. marts 2012 - 21:39 #8
Hej Arne,

Tusind tak for begge svar. Så lærte jeg noget nyt idag (encapsulation...). Det havde længe irriteret mig, at listen kunne ændres, selv om jeg f.eks. kun havde lavet 

public List<string> A
        {
            get { return _a; }
        }

Nu kan jeg se hvordan man kan gøre.

Smid et svar for points...

Mhv Ole
Avatar billede arne_v Ekspert
29. marts 2012 - 21:47 #9
svar
Avatar billede arne_v Ekspert
29. marts 2012 - 21:49 #10
ups

public List<string> A
        {
            get { return _a.AsReadOnly(); } // encapsulation !!!!
        }

skal vaere:

public IList<string> A
        {
            get { return _a.AsReadOnly(); } // encapsulation !!!!
        }

da AsReadOnly returnerer en IList<> ikke en List<>
Avatar billede olehaahr Nybegynder
29. marts 2012 - 22:02 #11
OK...

Forstår princippet :-)

Mvh Ole
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester