myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Gibt es eine Möglichkeit den Readonly Modifier zu umgehen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Gibt es eine Möglichkeit den Readonly Modifier zu umgehen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 151


Frokuss ist offline

Gibt es eine Möglichkeit den Readonly Modifier zu umgehen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wunderschönen :-)

Also, ich wollte mal fragen ob es eine Möglichkeit den readonly Modifizierer zu umgehen gibt? Der Hintergrund ist, dass ich einen eigenen Control erzeugt habe der als Attribut: readonly int id; hat. Jetzt möchte ich allerdings dynamisch einen solchen Control erzeugen, ohne dass mir die ID bereits bekannt ist... Die ID muss nämlich (theoretisch - habe noch keine DB-Anbindung) vom Server kommen.

Ich vermute dass es nicht geht... Aber die hoffnung stirbt ja bekanntlich zu letzt...

Gruß Frokuss
02.12.2019 15:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.364
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wird nicht funktionieren, weil sonst auch der readonly modifier sinnlos wäre.
Wenn du das Control ändern kannst, dann entferne den modifier und arbeite sauber mit der ID.
Z.b. wäre eine Anpassung der ID Property mit einem public getter und einem private setter.
Dann musst du nur beim erstellen des Controls die ID an den Konstruktor mitgeben und dort einmalig die ID setzen.

Wenn du es nicht ändern kannst, musst du schauen ob du das Problem anders lösen kann.

Muss die ID ein int sein?
Wenn möglich nimm Guid, wenn es eine eindeutige ID sein sollte, oder string wenn du auch andere Werte/Bezeichnungen verwenden willst.
Fast alle Controls nutzen Strings für ID im Web und Desktop Bereich in .NET

Nachtrag:
Wie genau soll der Server die Daten liefern?
Wenn es sich bei der Anwendung um eine UI für den Endbenutzer handelt, lädst du die Daten hoffentlich nicht direkt über die DB sondern von z.B. eine API in einem Web was dann auf die DB zugreift.
Somit bleibt deine DB sicher vor unbefugten Zugriffen ;)

T-Virus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 02.12.2019 16:06.

02.12.2019 16:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.236
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn Du sowas umgehen musst, dann hast Du ganz klassisch einen großen, in diesem Fall sogar einen schwerwiegenden Designfehler in Deiner Software Architektur ;-)

Zitat von T-Virus:
Wenn möglich nimm Guid, wenn es eine eindeutige ID sein sollte,

Nein. Das ist so pauschal ausgedrückt eine ganz ganz unglückliche Idee.
Eine Id sollte immer das sein, was sie auch ausdrückt - und das ist ganz bestimmt nicht immer eine Guid.

Vor allem so pauschal ausgedrückt spricht nichts, aber auch gar nichts gegen Int.
Ich bin prinzipiell auch ein Fan von Guid / UUID - aber Guid bringt _immer_ eine gewisse Komplexität rein.
Die prinzipiellen Nachteile von Int in Sachen DB-Skalierung (und das ist meist der einzig relevante Nachteil) spielt in 99,9999% der Projekte überhaupt keine Rolle.
->  KISS-Prinzip

Zitat von T-Virus:
Fast alle Controls nutzen Strings für ID im Web und Desktop Bereich in .NET

Nö.
02.12.2019 16:15 Beiträge des Benutzers | zu Buddylist hinzufügen
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 151

Themenstarter Thema begonnen von Frokuss

Frokuss ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@T-Virus:
Das mit dem private set ist mal ne super geile Idee :-D Habe ich noch nie vorher drüber nachgedacht :-D

@Abt:
warum ist das ein Fehler in der Architektur? Ich wolle ja nur verhindern, dass die ID sich grundlos ändern lässt. Jetzt habe ich halt genau einen einzogen Fall, in dem ich ihn ändern muss, da mir die ID noch nicht zur Verfügung steht. Ich habe damit die Möglichkeit wie sie mir T-Virus gezeigt hat, oder die Möglichkeit über einen "temporären"-Controll, der mit weniger auskommt und dann ersetzt wird...

Die ID muss nicht zwingend eine Zahl sein. Allerdings kommen die Daten (irgendwann mal) aus der Datenbank. Dort haben die Daten dann eine ID, die sich mit dem in meinem Controll decken würde. Sprich ändere ich den Text in meinem Controll, muss der Text auch in der DB geändert werden (und irgendwann mal im Jahr 3000 auch auf anderen Geräten). Dafür brauche ich die ID.

Ich habe jetzt das mal draus gemacht. Ich weis, ist natürlich total bescheuert, dass in 2 Methoden zu machen - will aber erzwingen, dass die ID nur in ausnahmefällen geändert wird.

C#-Code:
        public int ID {
            get { return id; }
            private set { id = value; }
        }

        public int ___ID {
            set {
                if(id == 0)
                    ID = value;
            }
        }

Aber mal ne Frage... welchen Wert hat denn ein int, wenn ich ihm noch keinen Wert zugewiesen habe? Also null ist es nicht... (int a, b, c;)

Ich kann meinen Anwendungsfall zwar erläutern - dann wäre dies aber wohl eher in der Rubrik WinForms einzuordnen...

Gruß Frokuss

Nachtrag: Darüber habe ich mir noch keine gedanken gemacht XD aber ich hätte sie aus einer DB gezogen... Ja, es handelt sich um eine UI für den Endnutzer. Also alles rund um den Server habe ich noch gar nicht gemacht... nichts!

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Frokuss am 02.12.2019 16:43.

02.12.2019 16:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.364
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Abt
Also bei ASP .NET mit Web Forms und WinForms sowie auch bei WPF sind meins Wissens nach alle Controls mit einer ID Property vom Typ String vorhanden.
Klar gibt es Aussahmen aber bei diesen würde was anderes als String kaum Sinn machen um diese eben per ID anzusprechen.

@Frokuss
int ist ein Werte Type und kann nie null sein, dies gilt nur für Referenztypen.
Nur wenn du ein Nullable Int hast, kann dies auch Null sein.
Ansonsten kannst du für die default Werte auch gerne in die Doku schauen.
Bei int ist der Default Wert immer 0.

Deine Umsetzung mit zwei Properties sieht sehr abenteuerlich aus.
Warum setzt du dann die Logik nicht im setter von ID ein und setzt den Wert dann nur wenn die interne Member Variable 0 ist?
Dann brauchst du keine zwei setter und dürftest immer nur einmal den Wert setzen.

Nachtrag:
Dann solltest du dir darum Gedanken machen.
Wenn die Anwendung z.B. über das Internet auf deine Datenbank zugreifen soll, dann wäre dies fatal diese direkt darauf zugreifen zu lassen.
Dafür schaltet man einen Webservice, der dann die API zum Datenaustausch mit der Anwendung anbietet.
Die Anwendung selbst bekommt dann keinen direkten Zugriff.
Die DB sollte dann auch sicher abgeschottet werden, damit kein direkter Zugriff darauf möglich ist.

T-Virus

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von T-Virus am 02.12.2019 19:50.

02.12.2019 19:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 151

Themenstarter Thema begonnen von Frokuss

Frokuss ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja, du hast recht... Ich neige manchmal die einfachsten Sachen unnötig kompliziert zu machen. Aber ist ja fix geändert...

Also vom Gedanken her wollte ich auf jeden Fall eine Server-Anwendung erstellen, die den alleinigen Zugriff auf die Datenbank hat. Diese verarbeitet dann die Komandos der ganzen Clients...

Gruß Frokuss
03.12.2019 13:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.236
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von T-Virus:
Also bei ASP .NET mit Web Forms und WinForms sowie auch bei WPF sind meins Wissens nach alle Controls mit einer ID Property vom Typ String vorhanden.

Ist das gerade Ironie, oder verwendest Du wirklich obsolete, uralte Technologien als Beispiel :-)

Davon abgesehen kannst Du basierend auf den Informationen hier im Thread überhaupt keine Aussage machen, welche Anforderungen die Id hat.
Ob es ein Control ist, ist total irrelevant.

Er schreibt doch sogar, dass die Id/das Control aus einer Datenbank kommt - hat also nicht unbedingt mit der UI, mit denen UI-Frameworks arbeiten zutun.

Zitat von T-Virus:
Die DB sollte dann auch sicher abgeschottet werden, damit kein direkter Zugriff darauf möglich ist.

Auch hier kennst Du die Gegebenheiten nicht, sofern wir die Informationen nur hier aus dem Thread haben.
Ja, ein Service macht oft sinn - aber nicht immer.

Zitat von Frokuss:
warum ist das ein Fehler in der Architektur? Ich wolle ja nur verhindern, dass die ID sich grundlos ändern lässt.

Die ID soll wohl bewusst readonly sein; willst aber eine Hintertür haben, um sie doch ändern zu können.
Da klingeln alle Alarmglocken, dass hier was nicht stimmen kann :-)
Und natürlich gibt es bei readonly nicht wirklich eine Hintertür - und das ist auch gut so.

Solche "Ausnahmefälle" muss Deine Logik und Dein Konzept abdecken - nicht der C# Sprachsyntax.

Zitat von Frokuss:
Also alles rund um den Server habe ich noch gar nicht gemacht... nichts!

... wäre wohl besser gewesen, wenn Du Dir vor dem Programmieren ein Konzept gemacht hättest. :-)
Empfehl Dir Deine Herangehenweise hier etwas zu überdenken.

Die Gefahr, dass Du hier viel geschriebenen Quellecode wegwerfen darfst, weil Dir ein Konzept fehlt, ist immens - und im Allgemeinen leider auch sehr wahrscheinlich.
03.12.2019 18:05 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 07.12.2019 18:18