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

  • »
  • Community
  • |
  • Diskussionsforum
Zwei Variablen sollen immer auf den selben String verweisen
Sclot
myCSharp.de - Member



Dabei seit:
Beiträge: 324
Herkunft: Bremen

Themenstarter:

Zwei Variablen sollen immer auf den selben String verweisen

beantworten | zitieren | melden

Nabend,

ich bezieh mich mal auf diesen Text:
http://www.guidetocsharp.de/Old/home/index.html?http%3A//www.guidetocsharp.de/Old/guide/guide9.html

Wenn ich jetzt aber folgendes mache:


string a = "db=db1";
string b = a;

a = "db=db2";
Console.WriteLine("a: "+a);
Console.WriteLine("b: "+b);

Dann bekomme ich:

a: db=db2
b: db=db1


Laut dem vielen geschriebenen Worten im oben geposteten Link, sollte doch jetzt in der Variable b auch der Inhalt von a stehen - oder nicht?

Jetzt bräuchte ich zum ersten mal sinnvoll den Inhalt von a auch in b und bin am verzweifeln, weil ichs nicht hin bekomm :-(
private Nachricht | Beiträge des Benutzers
F.Z.
myCSharp.de - Member



Dabei seit:
Beiträge: 155

beantworten | zitieren | melden

Hallo,

dieses verhalten kommt daher da sich die string Klasse nicht wie eine normale Klasse verhält,

sie verhält sich wie ein Wertetyp (inhalt wird kopiert nicht refernz).

Grüße
FZ
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
private Nachricht | Beiträge des Benutzers
Sclot
myCSharp.de - Member



Dabei seit:
Beiträge: 324
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Ich brauch das aber als Referenz, also was tun? :-/
private Nachricht | Beiträge des Benutzers
Zicore
myCSharp.de - Member



Dabei seit:
Beiträge: 403

beantworten | zitieren | melden

Wenn du eventuell noch das Anwendungsgebiet schilderst können wir vielleicht genauer helfen
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Sclot,
Zitat
sollte doch jetzt in der Variable b auch der Inhalt von a stehen
nö, du überschreibst ja b wieder. Also steht in b was anders als in a. Das in b mal das gleiche stand wie in a, wird ja durch das Überschreiben hinfällig. Das geht aber schon sehr in Richtung [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
Zitat
dieses verhalten kommt daher da sich die string Klasse nicht wie eine normale Klasse verhält,
Das Verhalten hat mit Strings überhaupt nichts zu tun, sondern bei jedem beliebigen Typ würde der Inhalt von b nach der erneuten Zuweisung eines anderen Werts nicht mehr mit dem von a übereinstimmen.
Zitat
inhalt wird kopiert nicht refernz
Das stimmt nicht. String ist ein Referenztyp und somit werden bei einer Zuweisung immer die Referenzen kopiert und nicht der Inhalt. Die "gefühlte" Wertsemantik der Klasse String kommt daher, dass die Klasse String immutable implementiert wurde. Siehe [FAQ] Besonderheiten der String-Klasse (immutabler Referenztyp mit Wertsemantik).
Zitat
Ich brauch das aber als Referenz, also was tun?
Referenzen auf Variablen sind in C# (außer bei der Parameterübergabe) nicht möglich. Es gibt nur Referenzen auf Objekte. Du kannst eine eigene Klasse C schreiben, die eine String-Property S hat und a und b auf ein und dasselbe Objekte der Klasse zeigen lassen. Wenn du dann die String-Property änderst, kannst du deren Inhalt sowohl über a.S als auch über b.S abrufen und bekommst in beiden Fällen denselben String.

herbivore
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

Hi,

wieso nicht einfach einen StringBuilder nehmen? Der kann ja immer gelöscht und neu gesetzt werden. Könnte z.B. folgendermaßen aussehen:


var sb = new StringBuilder();
sb.Append("Ein String");
var sb2 = sb;
Console.WriteLine(sb2); // => Ein String
sb.Remove(0, sb.Length);
sb.Append("Ein anderer String.");
Console.WriteLine(sb2); // => Ein anderer String

Ist denke ich einfacher, als sich irgendwas hinzufrickeln ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Corpsegrinder am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.779
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Corpsegrinder,

da ist die Variante mit der (kapselnden) Klasse schon um einiges objektorientierter und sauberer - man sieht auch sofort was gemeint ist.
Deinen Ansatz finde ich eher hingefrickelt ;) - kann sein dass für das simple Vorgehen funktioniert, aber pädagogisch wertvoll ist er nicht.


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Corpsegrinder,
Zitat
... als sich irgendwas hinzufrickeln ;-)
mit dem Gefrikel hast du insofern Recht, dass ich sehr technisch beschrieben habe, was zu tun ist, um das Problem zu lösen. Natürlich sollte man in C# objektorientiert programmieren und nicht versuchen, die Mechanismen so zu (miss)brauchen, dass man irgendwie hinbiegt, was man erreichen will. In diesem Sinn sollte man sich also überlegen, was inhaltlich und konzeptuell hinter dem Wunsch, zwei Referenzen auf ein Objekt zu setzen, steckt. Man sollte also nicht - wie das vielleicht geklungen hat - eine technische bzw. Hilfsklasse C schreiben, sondern eine ganz normale Modellklasse mit einem sprechenden Namen und inhaltlich passenden Properties sowie einem klaren Bezug von allem zur Realität.

Wenn wir uns also darauf einigen können, dass man möglichst nicht auf der technischen Ebene rumfrikeln sollte, dann scheidet StringBuilder allerdings auch aus. :-)

herbivore
private Nachricht | Beiträge des Benutzers
Sclot
myCSharp.de - Member



Dabei seit:
Beiträge: 324
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

OK...

Der Ursprüngliche Sinn des ganzen war, in allen Instanziierten Klassen von einem Bestimmten Objekt (DB-Backend) einen String ändern zu können (den Connectionstring).

Jetzt hab ichs über einen Static String gelöst, der wie beschrieben in allen Objekten immer der selbe ist - praktisch das.

Jetzt stellt sich mir nur die Frage ob was Wechseln der Datenbank im laufenden Betrieb durch das Ändern des Conenctionstrings im DB-Backend Objekt wirklich so eine gute Idee ist oder nicht.

Ein "use DBNAME" vor jedem Query finde ich unschön...
Und ein "SELECT [feld1],[feldx] FROM DBNAME.tabelle" überall einzubauen find ich auch irgednwann unübersichtlich.
Im ConnectionString kann man praktischerweise gleich die Standard-Datenbank angeben, auf welcher man arbeiten möchte, so fallen die beiden oben beschriebenen lösungen weg.

Eure Meinung?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.779
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,

das Problem mit der DB geht man normalerweise anders an. Ohne hier eine konkrete Antwort zu geben ein paar Stichwörter die dir Suche erleichtern sollen:

3-Schichten-Modell, DB-Factory, Fabrik, Service

Kurz gesagt du hast für jede DB eine Klasse welcher per Fabrik erzeugt wird. In dieser Klasse ist auch der Datenbankzugriff gekapselt - alle diese Klassen implementieren eine Schnittstelle und somit schaut von außen jede DB gleich aus...


mfG Gü
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von gfoidl am .

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Sclot
myCSharp.de - Member



Dabei seit:
Beiträge: 324
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Das ist mir irgendwie schon klar :-)

Ich meine mit Datenbank wechseln auch wirklich nur die Datenbank wechseln im sinne von Mehr-Mandanten-Fähigkeit - nicht im Sinne von Datenbank-Server wechseln.

Sry, wenn das so missverständlich rüber kam.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Sclot am .
private Nachricht | Beiträge des Benutzers