C# warum private statt public?

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

weil bei der OOP das paradigma gilt , das objekt verwaltet sich selber und stellt halt funktionen zur verfügung über die man verwaltete dinge regeln kann .

wäre eine variable public kann das objekt nicht nur selber es verwalten . ausserdem muss es dem nutzer des objektes egal sein wie intern gearbeitet wird .

aber mal ein beispiel

es gibt ein haus mit 4 stockwerken . dort drinne ist ein fahrstuhl .

wenn du jetzt dem fahrstuhl sagst, fahre in den 5 stock , dann geht das nicht , also verwaltet der fahrstuhl selber wieviele stockwerke es gibt .

wenn du einfach maxstockwerke auf 5 setzen könntest , warum ist es dann in einem 4 stöckigen haus . ergo muss das schonmal unterbunden werden , beim hausbau und einbau des fahrstuhls steht fest das der maxstockwerk bei 4 ist , bzw 4 stockwerke groß ist . da hat von ausser gar keiner was zu ändern .

wenn du das public machst, könntest du ja einfach schreiben stockwerk = 5 und der fahstuhl wäre im 5. stockwerk .

nein deswegen hat der Fahrstuhl eine maxstockwerk und ein stockwerk attribut .

du kannst dann gerne eine funktion aufrufen mit fahreinstockwerk(5) und die funktion gibt dir dann den fehler zurück das es kein 5 stockwerk gibt oder nur bis zum 4 stockwerk gefahren werden konnte.

die kapselung ist eine ganz wichtige funktion , sonst wird das objekt fremdgesteuert und das ist halt ein problem . fahrstuhl in den 5 stock bei einem 4 stöckigen haus führt halt zu problemen .

Get Set Methode? Meinst du ein Property? In der Regel werden Properties auch auf public gestellt. Die sind ja meist dazu gedacht, von außerhalb erreichbar zu sein. Variablen hingegen könnten so sein, dass dein Code eine benutzt, aber von außerhalb darf die nicht erreichbar sein. Deshalb Privat. Oder die Variable ist public und von innen und außen erreichbar. Nachteil wäre, bei public könnte man Variablen verfälschen, die nicht verfälscht werden dürfen/sollen. Stell dir vor, du schreibst eine Bibliothek. Jetzt hast du Hundebeine als int und Wert ist 4. Der Hund ist Gesund. Jetzt kommt ein anderer Entwickler und nutzt deine Bibliothek. Hundebeine sind public und er ändert, trotzdessen, dass der Hund gesund ist, die Variable zu 3. Schon Mission gefailed. Deshalb machen wir die Variable private und geben dem anderen entwickler lieber ein Property, in welchem wir theoretisch zusätzliche checks einbauen können

In C# nutzt man keine Get/Set-Methoden sondern Properties.

Das Ziel ist bei beiden aber das gleiche: Kontrolle.
So kann die Klasse kontrollieren, was rein kommt und sicherstellen, dass es nie zu einem ungültigen Zustand kommt.
Oder Du möchtest nur lesenden Zugriff erlauben. Oder Du möchtest schreibenden Zugriff nur ableitenden Klassen (protected) erlauben, oder nur in der selben Assembly (internal) oder eine der Misch-Varianten.

Vielleicht möchtest Du auch mehr tun, z.B. habe ich bei meinem aktuellen WPF-Projekt eine Situation, dass ich im Setter einer Property einen Timer zurücksetze, damit ein paar Sekunden ohne Änderung an der Property etwas passiert.

Oder Du hast Interfaces, dann kannst Du in UnitTests eine Mock-Implementierung mit passend implementierten Properties vorbereiten, mit einer Variable wäre das nicht möglich.

Bei mir ist generell nie eine Variable nicht private. Wenn sie irgendwo außerhalb der Klasse benötigt wird, mache ich eine Property daraus oder biete einen anderen Weg an.

Woher ich das weiß:Berufserfahrung

Das Konzept ist nur das nötige nach außen zu anderem Code zu exposen.

Einzelne Komponenten sollen intern änderbar bleiben und hier ist es sinnvoll wenn fremder Code nicht auf interne Dinge zugreifen kann. So kann man diese Dinge bedenkenlos ändern und muss sich nur eventuell darum kümmern, dass die Dinge die über public anderem Code exposed sind ihr Verhalten nicht einfach ändern.

In C# gibts get und set bei Properties, das ersetzt getter und setter in anderen Sprachen. Getter und Setter sind genau dafür da um den Zugriff von außen zu Regeln damit anderer Code nicht direkt auf die internen Attribute zugreifen muss.

Außerdem kann man z.B. das lesen (get) public machen aber das schreiben (set) privat. Oder man parsed Werte/hat intern vielleicht irgendeine caching logik hinter einem get. Für so was kann man das gut verwenden.

Das Konzept nennt sich encapsulation und wir zusammen mit dem OOP Gedanken in Klassenbasierten Sprachen bis zur Perversion getrieben 🥵

Woher ich das weiß:Berufserfahrung – Software Entwickler / Devops

BcksteinForelle  31.01.2022, 17:54

c# ist doch eh 100% decompilebar da is t doch allex exposed :D

0
BeamerBen  31.01.2022, 18:01
@BcksteinForelle

Es besorgt mich, dass ich nicht einschätzen kann ob das Sarkasmus ist, oder du einfach keine Ahnung vom Thema hast.

1
BcksteinForelle  31.01.2022, 18:04
@BeamerBen

angst um code exposed zu haben und dann open source zu sein macht sinn oder ich versteh was falsc hgrad

0
BeamerBen  31.01.2022, 18:09
@BcksteinForelle

🙃

Es geht um Software Design nicht um Security.

Du kannst auch Reflection nutzen oder statt zu decompilen einfach den Source Code auf machen wenn es dein eigener ist.

Ich bin immer noch nicht sicher ob du trollst oder nicht, und selbst wenn es einem irgendwie drum gehen würde code zu obfuscaten wtf hat das damit zu tun ob der compiler/runtime open source ist

3