Avatar billede odsgaard Praktikant
29. april 2014 - 13:22 Der er 8 kommentarer og
1 løsning

Properties vs indkapsling

Hej eksperter

Nu har jeg hygget mig lidt med java og er begyndt at kigge på C#.

Det er jo rasende nemt at lave Properties med get/set metoder i C#. Er der den samme indkapsling af en property som der er med en privat klassevariabel med get og set metoder?

public int Property {get; set;}

private int field;
public int getField(){ return field; }
public void setField(int field){ this.field = field; }

Udover, at det er meget nemmere at lave properties, hvad taler så for/imod denne metode?

Hilsen
Brian
Avatar billede kalp Novice
29. april 2014 - 13:39 #1
Det er blot en shortcut - C# laver properties om til netop get og set metoder.
Avatar billede kalp Novice
29. april 2014 - 13:41 #2
Det sker selvfølgelig inde bag i, men din int property får automatisk genereret en privat variable og et sæt get og set metoder til at læse og sætte den med.

Du kan se det hvis du køre i debug mode at det rent faktisk også er tilfældet.
Avatar billede kalp Novice
29. april 2014 - 13:45 #3
I C# bør du bruge properties og ikke lave GET og SET manuelt.

Det eneste spørgsmål er om du skal skrive:

public int Property {get; set;}

eller

private int property;
public int Property {get { return property ;} set { property = value; }}

Den sidste give dig mulighed for at gøre "andre" ting før du henter eller sætter værdien - præcis du ville kunne gøre med set og get metoder:)
Avatar billede odsgaard Praktikant
29. april 2014 - 13:59 #4
Når man laver en property, kan man jo godt komme 'krop' på get og set - opvejer det ikke at man laver en privat variabel?

public int Property {
  get;
  set { if (something){do something }}
}


Er der indkapsling når man laver en property?


/Brian
Avatar billede kalp Novice
29. april 2014 - 14:14 #5
Dit eksempel er skidt fordi enten skal du lade begge dine properties være auto implementeret eller også skal begge have en krop. Med andre ord dit eksempel vil give kompilerings fejl:)

men jeg forstår hvad du spørger om og groft sagt så ja det er indkapsling, men i sin simpleste form. Vi har nemlig ikke direkte adgang til den private int, som der bliver generet i ovenstående, men får adgang til den via. en public get metode, som C# generere.
Avatar billede clausc Nybegynder
29. april 2014 - 17:26 #6
I forlængelse til kalp's glimrende svar:

Du kan sætte protection level; f.eks. en public getter og en private setter:
public int Foo { get; private set; }

Det virker fint i interfaces:
public interface Foo
{
  int Bar { get; set; }
}

Jeg vil stærkt anbefale denne måde; det er en integreret del af sproget og hvis du koder Java-style getFoo()/setFoo(), så vil dine klasser i høj grad være anderledes. F.eks.

Foo a = new Foo();
Bar b = new Bar();
Wtf c = new Wtf();
a.Name = "hello world";
b.setName("hello world");
c.Name = "hello world";

Alle points til kalp. Han svarede på det væsentligste.
Avatar billede arne_v Ekspert
30. april 2014 - 04:34 #7
Som allerede naevnt er det bare noget syntaktisk sukker.

Det er nemmere baade at definere og at bruge properties.

Du boer absolut bruge dem. Mange libraries som bruger reflection vil forvente at der bruges properties.

Eneste ulempe er at syntaxen for at bruge properties er den samme som for at bruge fields.
Avatar billede odsgaard Praktikant
30. april 2014 - 09:29 #8
Tak for jeres kommentarer - jeg tror jeg fik svar på det jeg spurgte om.

Kalp, du fortjener pointene, så smider du et svar :)

/Brian
Avatar billede kalp Novice
30. april 2014 - 09:42 #9
:-)
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