Laden...

Zwei Variablen sollen immer auf den selben String verweisen

Erstellt von Sclot vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.679 Views
S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren
Zwei Variablen sollen immer auf den selben String verweisen

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 😦

F
155 Beiträge seit 2009
vor 13 Jahren

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."

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

Ich brauch das aber als Referenz, also was tun? 😕

Z
403 Beiträge seit 2007
vor 13 Jahren

Wenn du eventuell noch das Anwendungsgebiet schilderst können wir vielleicht genauer helfen

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sclot,

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.

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.

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).

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

C
401 Beiträge seit 2007
vor 13 Jahren

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 😉

6.911 Beiträge seit 2009
vor 13 Jahren

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!"

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Corpsegrinder,

... 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

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

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?

6.911 Beiträge seit 2009
vor 13 Jahren

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ü

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!"

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

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.