C# Referenz (Zeiger) auf String speichern

meisteralex

Lieutenant
Registriert
Juni 2003
Beiträge
552
Hi Leute, ich habe einen sehr lange String, den ich in zimlich vielen Objekten brauche. Ich möchte daher meine Objekten eine Referenz auf diesen String mitgeben, wenn ich Sie erzeuge.
Leider is in C# die Zeiger - Arithmetik ja in C# nicht mehr verwendet werden soll / darf steht ich nun vor einmel Problem.
In C++ hätte ich einfach nen Zeiger auf den String in die Objekte gepackt, nur wie mache ich das in C# ???
P.S. nach einem WorkArround indem ich mir eine neue Klasse erzeuge, welche dann wiederum einen String enthält suche ich nicht!

Danke schonmal.
 
Dann übergib doch den String einfach im Konstruktor der Objekte. Ein String ist ein Objekt und wird immer als Referenz übergeben. Alternativ kannst du auch irgendwo eine public static-Variable machen auf die alle dann zugreifen können.

Eine manchmal praktisch Funktion ist übrigens die hier: http://msdn.microsoft.com/en-us/library/system.string.intern.aspx Auch die Anmerkungen dazu (erklären das interne Management von Strings) könnten interessant für dich sein.
 
Zuletzt bearbeitet:
Du kannst auch mit ref bzw. out arbeiten, diese Schlüsselwörter sorgen dafür das Funktionsparameter als Referenz übernommen werden. Was heißt hier btw. Leider wird die Zeigerarithmetik nich mehr verwendet ... GOTT SEI DANK wird die nich mehr verwendet ;). Du kannst aber auch in C# Zeigercode ausführen wenn du das in ner unsafe{} schleife machst und dem Compiler n Kommando mitgibst.
 
meisteralex schrieb:
In C++ hätte ich einfach nen Zeiger auf den String in die Objekte gepackt, nur wie mache ich das in C# ???
Möchtest du jetzt einen Zeiger oder eine Referenz? C++-Zeiger benutzt du in C# automatisch. C++-Referenzen erreichst du mit ref und out.
 
ich möchte in einem object eine referenz (was ja nichts anderes ist als ein zeiger) auf einen string speicher.

sprich ich hab

Code:
class myclass
{
  public thestring;

  public myclass(string _thestring)
  {
    thestring = _thestring;
   }
};


nun möchte ich nicht in jedem objekt meiner klasse myclass einen neuen string drinne haben, sondern halt nur die referenz gespeichert haben, so dass alle instanzen meiner klasse auf den selben string zugreifen
 
meisteralex schrieb:
ich möchte in einem object eine referenz (was ja nichts anderes ist als ein zeiger) auf einen string speicher.
Nicht in C++ von dem du ja sprichst.

nun möchte ich nicht in jedem objekt meiner klasse myclass einen neuen string drinne haben, sondern halt nur die referenz gespeichert haben, so dass alle instanzen meiner klasse auf den selben string zugreifen
Wie BerniG schon bemerkte: Das tust du bereits.
 
nein, ich habs grad nochmal ausprobiert, es werden kopien angelegt ! ich will aber referenzen, bzw. zeiger, je nach dem wie man es ausdrücken will;

ums nochmal zu sagen:

ich lege einen string an:
string originalstring = "das ist das original";

dann instanziere ich objecte und will referenzen auf dieses originalstring mitgeben, so das alle auf diesen string (den originalstring!!) zugreifen können.
 
indem ich 2 objekte instanziert habe, über set methoden die strings geändert habe und mir nach dem ganzen prozezz der instanzierung und änderung wieder den originalstring aus der ausrufenden prozedur ausgegeben habe. Es war noch der originalstring !"
 
Natürlich ist der derselbe geblieben. Du willst nämlich wie vermutet wirklich C++-Referenzen(alternativ würde es wohl auch ein Zeiger auf einen Zeiger tun) und keine C++-Zeiger(was normalen C# Referenzen entspricht). So etwas gibt es in C# nicht. Kopiert wird deswegen aber noch lange nichts. Sowas lässt sich teilweise durch ref und out ersetzen aber nicht vollständig. Da musst du dir schon eine eigene Klasse erstellen.

Code:
	class StringRef {
		public string string_;	
		
		public StringRef(string str) {
			string_ = str;
		}
	
	}
Die kannst du dann statt des Strings übergeben und dann immer StringRef.string_ verändern.

Edit: Evtl erfüllt auch ein 1-elementiges Array seinen Zweck, oder eben unsafe-Code.
 
Zuletzt bearbeitet:
Du könntest auch StringBuilder übergeben. Du darfst natürlich nicht dann später mit "new StringBuilder" arbeiten sondern musst stattdessen per remove den entsprechend nötigen Teil löschen (sofern überhaupt nötig) und mit append wieder hinzufügen.
 
Zurück
Oben