Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Warum Properties verwenden, wenn man auch ein Feld verwenden könnte?
afrix
myCSharp.de - Member



Dabei seit:
Beiträge: 1

Themenstarter:

Warum Properties verwenden, wenn man auch ein Feld verwenden könnte?

beantworten | zitieren | melden

Hallo,

ich bin relative neu in der Entwicklung mit C#, habe davor aber bereits in mehreren andern Sprachen programmiert!

Meine Frage:

Wenn ich in einer Klasse ein öffentliches Attribut erstellen möchte, mache ich das doch so:

private int meinAttribut;

public int MeinAttribut
{
    set { meinAttribut = value; }
    get { return meinAttribut; }
}

Was ist der Unterschied zu folgeder, viel einfacheren Zeile, die doch auch funktioniert, oder?

public int MeinAttribut;


Vor allem wird es für mich unklar, wenn es nicht einfache Datentypen wie Integer sind, sondern z.B. Listen. Da geht es ja nicht nur um "Setzen" und "Auslesen", sondern auch mal um die Länge abfragen, eine Methode der Liste aufrufen etc. Wie würde ich das mit der oberen Variante lösen?

Danke für eure Antworten!

Gruß
Andi
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 7290
Herkunft: Esslingen

beantworten | zitieren | melden

Hallo,

das sind keine Attribute (das ist in .Net was anderes) sondern Properties.
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 Wir erwarten ein gewisses Grundwissen. Im besagten Punkt findest du weitere Informationen zum Einstieg in C#.
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

Hallo afrix,

die "viel einfachere Zeile" stellt kein Attribut dar, auch keine Eigenschaft (wie dein erstes Codebeispiel, das auf ein privates Feld zurückgreift), sondern ein öffentliches Feld. Das sind allerdings, wie talla schon betont hat, Grundlagen, die wir hier voraussetzen.

m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Hallo afrix,

Das erstere ist ein Feld, welches durch ein Propertie (get-set) gekapselt ist.
Das letztere ist nur ein öffentliches Feld.

Das sind jedoch absolute Grundlagen und werden in wirklich jedem C# Buch behandelt. (siehe bitte [Hinweis] Wie poste ich richtig? Punkt 1.1.1)

Warum es die gibt und warum man nach außen hin eher Properties verwenden sollte, wurde hier schon oft genug besprochen. Außerdem wird dies auch in jedem Buch über Objektorientierung behandelt.

gruß
Jack

Ergänzung von herbivore: Kapselung erlaubt dem Objekt, Änderungen an den Properties zu verhindern, die das Objekt in einem fehlerhaften Zustand bringen würden oder bestimmte Aktionen als Reaktion auf die Änderung auszulösen (Stichwort: Events). Selbst wenn das zu Anfang noch nicht der Fall ist, sollte man trotzdem schon Properties verwenden, um bereit für nachträgliche Änderungen zu sein. Properties sehen zwar nach außen ähnlich aus wie öffentliche Felder, aber sind konzeptionell doch etwas wesentlich anderes. Felder sollten nie öffentlich sein. Verwende stattdessen immer Properties.
Pico1184
myCSharp.de - Member

Avatar #avatar-2893.jpg


Dabei seit:
Beiträge: 234
Herkunft: Karlsruhe

beantworten | zitieren | melden

Zitat
Was ist der Unterschied zu folgeder, viel einfacheren Zeile, die doch auch funktioniert, oder?

public int MeinAttribut

Dies ist eine öffentliches Feld! Man sollte allerdings keine Felder nach außen hin zugänglich machen, verwende anstatt öffentlichen Feldern die Properties mit get und set wie du es oben geschrieben hast.

Bei einer Liste vom Typ MyObject würde das so aussehen:


public class MyClass
{
List<string> texts;

public MyClass(List<string> textList)
{
texts = textList;
}
//Anzahl der items in der Liste
public int Count
{
get { return texts.Count;}
}
}
Das sind Grundlagen welche du auch unter oder nachlesen kannst!

Grüße Pico
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Pico1184 am .
private Nachricht | Beiträge des Benutzers

Moderationshinweis (07.12.2010 - 11:34:53):

Ok genug der gleichlautenden Erklärungen ;-)