C# Setzen von Attributen im Konstruktor mit Properties?

enc0re

Newbie
Registriert
Dez. 2010
Beiträge
1
Hallo,

mir stellt sich gerade die Frage, was denn schönerer Stil ist:

Beispiel:

Code:
public class Apfel
{
    private String sorte;

    public Apfel(String sorte)
    {
        //entweder
        Sorte = sorte;

        //oder
        this.sorte = sorte;
    }

    public String Sorte
    {
        get { return sorte; }
        set { sorte = value; }
    }
}

Hat jemand ne Meinung? Danke schon mal im Voraus. :)
 
mit den Properties hast du teilweise einen Vorteil gegenüber Feldern... Du kannst innerhalt von Properties zusätzliche Zugriffsrechte vergeben.

Code:
public int Value
{
    get;
    private set;
}

so kannst du nur den Getter Public machen und den Setter nur innerhalb deiner Klasse verfügbar machen.

Properties sind aber nichts anders als die Methoden. Klar, solange du programmierst siehst du nur Properties und keine Methoden. Sobald der Compiler anfängt zu arbeiten, wird Property in eine Methode umgewandelt. Dann hast du sowas wie

Code:
public int GetValue(){...}
///und
private void SetValue(int value){...}


Eventuell wird es dann bei der Performance wichtiger als die Felder anstatt auf die Properties zuzugreifen!
 
roker002 schrieb:
mit den Properties hast du teilweise einen Vorteil gegenüber Feldern... Du kannst innerhalt von Properties zusätzliche Zugriffsrechte vergeben.
Das geht mit "normalen" Properties aber auch:
Code:
private string name;
public string Name
{
    get { return this.name; }
    private set { this.name = value; }
}

roker002 schrieb:
Eventuell wird es dann bei der Performance wichtiger als die Felder anstatt auf die Properties zuzugreifen!
Wird es in 99,99% der Fälle nicht! Der Performance-Overhead von Properties ist so gering, dass es erst ab ein paar Millionen Zugriffen spürbar ist.
Nicht vergessen: "Premature optimization is the root of all evil." ;)

Im Grunde ist es eine reine Geschmacksfrage. Kapselung ist sowieso nur nach außen hin nötig (und vorallem möglich). Ich persönlich benutze deshalb bei "einfachen" Properties innerhalb der Klasse meist die Felder. Wenn das Property allerdings zusätzliche Logik enthält musst du im Einzelfall entscheiden ob die Logik angewendet werden soll (=> Zugriff auf Property) oder eben nicht (=> Zugriff auf Feld).
 
Ich persönlich verwende möglichst immer die Properties sowohl intern als auch extern um auf die Felder zuzugreifen. Das liegt daran das, wie CadillacMan schon schrieb, der Overhead zwar da, aber erst bei massiven Zugriffen spürbar wird. Aus meiner Sicht gewinnt man somit keine Geschwindigkeit bei den üblichen Programmen. Zum anderen, für mich sehr wichtig, ist, dass der Zugriff über die Property stets geregelt, während das bei einem direkten Zugriff auf das Feld nicht ist.

Um bei dem Beispiel mit der Name Property von CadillacMan zu bleiben. Der String Typ akzeptiert Strings und null. Bei Zugriff auf ein null durch eine Methode wird eine NullReferenceException geworfen. Das passiert nur zur Laufzeit und wird nicht vom Compiler bemerkt. Wenn du nun fehlerhafterweise einen Code in eine Methode implementierst, der das Feld auf null setzt, dann reist du damit alle anderen von dem Feld abhängigen Funktionalitäten mit in die Tiefe. Als Ausweg könntest du nun bei jedem Zugriff auf das Feld oder die Property anschließend prüfen ob es sich um null handelt, was aber nicht wirklich gut ist, da du hier massiv redundanten Code einbauen musst. Mehr Code, mehr Komplexität, mehr Wartung, mehr Zeit, mehr Geld. Einfacher wäre es nun strikt über den Getter und Setter das Feld anzusprechen. Innerhalb des Setters machst du dann einmalig die Prüfung ob null und verwendest dann string.Empty anstelle dessen:

Code:
private string name;
public string Name
{
    get { return this.name; }
    private set 
    { 
       if(value == null) value = string.Empty;
       this.name = value; 
    }
}

Ist aber letzten Endes wie schon geschrieben eine Geschmackssache, wie man es macht...
 
das ist gut zu wissen...
@TheCadillacMan
Ich meinte ja nicht dass ich ohne Felder irgendwas optimieren will...Ich selbst benutze teilweise die Properties, wenn ich kein Lust hast eine Methode zu schreiben die irgendwas berechnet und dies zurückgibt.
 
Zurück
Oben