C# Globale/Lokale Variablen

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,
ich hätte da ein Problem und begreif einfach nicht wieso das so ist.

Normal sollte der Code stimmen:

Code:
using (FileStream fs = File.Open("test.txt", FileMode.Open, FileAccess.Read)) {
				byte[] b = new byte[1024];
				UTF8Encoding temp = new UTF8Encoding(true);

				while (fs.Read(b, 0, b.Length) > 0) {
					string Daten = temp.GetString(b);
					Einstellungen = Daten.Split(new Char[] { ';' });
				}
			}
	
			using (FileStream fs = File.Open("test.txt", FileMode.Create, FileAccess.Write)) {
				byte[] Schreibdaten = new UTF8Encoding(true).GetBytes(Einstellungen[0] + ";"
						+ Name + ";" + Email + ";" + Telefon);
				fs.Write(Schreibdaten, 0, Schreibdaten.Length);
			}

Er spuckt mir ständig nen Fehler aus, dass in dem 2. using es eine "LOKALE" Variable "Einstellungen[0]" und sie nicht zugewießen ist. aber die wird doch schon oben zugwießen.


Vielen Dank für die Hilfe schon im vorraus.
 
Ja schon richtig. Nur passiert das in einem anderen Scope ;) Deshalb kriegst du Probleme. Setz die variable doch einfach auf Null vorher und gut ist.
 
kommt darauf an wo und wie du die Variable Einstellungen definiert hast. Da fs.Read auch false zurückgegeben kann ist zudem nicht sicher ob Einstellungen jemals ein Wert zugewiesen wird...
 
Hier nochmal der Code von der ganzen Funktion:

Code:
private void cmdSpeichern_Click(object sender, EventArgs e) {
	string Name = txtName.Text;
	string Email = txtEmail.Text;
	int Telefon = Convert.ToInt32(txtTelefon.Text);

	string[] Einstellungen;

	using (FileStream fs = File.Open("test.txt", FileMode.Open, FileAccess.Read)) {
		byte[] b = new byte[1024];
		UTF8Encoding temp = new UTF8Encoding(true);

		while (fs.Read(b, 0, b.Length) > 0) {
			string Daten = temp.GetString(b);
			Einstellungen = Daten.Split(new Char[] { ';' });
		}
	}
	
	using (FileStream fs = File.Open("test.txt", FileMode.Create, FileAccess.Write)) {
		byte[] Schreibdaten = new UTF8Encoding(true).GetBytes(Einstellungen[0] + ";"
				+ Name + ";" + Email + ";" + Telefon);
		fs.Write(Schreibdaten, 0, Schreibdaten.Length);
	}

	this.Close();
}

Kapiere nicht wieso es da meckert. Deklariert wird es ja als globale variable nur initialisiert wirds dann in dem block von dem ersten using.
Deswegen sollte die Variable mit dem Wert aber doch trotzdem nach dem Block vom ersten using erhalten bleiben.
 
ja wie toeffi schon gemeint hat, wird die Variable Einstellungen in einem anderen Scope zugewiesen und das auch nur wenn fs.Read true zurückgibt...

/edit: du kannst es so machen wie toeffi gemeint hat dasd Einstellungen oben auf null setzt, aber dann solltest du unten zumindest auf null prüfen...
 
Zuletzt bearbeitet:
hmm... und wie kann ich das dann Lösen?
Irgendeine idee?

Bin ziemlicher neuling in sachen c#
Lerne es erst seit einigen Tagen =(
 
Wenn dir es nicht unbedingt ein array sein muss kannst du doch auch einfach ne Liste definieren:

Code:
List<string> einstellungen = new List<string>;
//in deinem Block dann

einstellungen = Daten.Split(new Char[] { ';' }).ToList();
 
Probier ich gleich mal aus. ich brauch eigentlich nur das/den aller erste/n wort/wert von der variable Daten.
Ergänzung ()

Ok es funzt nicht. Kann ich vergessen. Spuckt sogar noch mehr Fehler aus xDD
 
Also in der Datei test.txt steht gleich an erster Stelle ein Wert (immer). Dieser Wert soll fest sein, der muss immer vorhanden sein und imemr an 1. Stelle.
Zu diesem Wert werden dann 3 weitere hinzugefügt (angehängt) - Name, E-Mail, Telefon.

Soweit wärs ja kein Problem wenn ich z.b. einfach den modus "append" benutze. Aber das Problem: Sollte der User z.B. name, email oder telefon irgendwann mal abändern und dann wieder auf speichren klicken, sollen ja nur name, email und/oder telefon überschrieben werden mit neuen werten. der erste wert jedoch soll erhalten bleiben und es sollen auch allgemein nicht mehr wie 4 in der gesamten datei sein:

Wert1 ; Name ; Email ; Telefon
 
Zhen:
Was heißt vergessen? Wenn du Fehler hast, lies sie dir genau durch und versuche sie zu verstehen, dann kannst du die meisten auch beheben. Ich poste hier ja auch keine konkrete Lösung für dein komplettes Programm, sondern nur ne Lösung für dien Ursprungsproblem.
Desweitern wäre es gut wenn du uns die Fehler präsentierst.
 
Also bei meiner Methode kommt folgendes als Fehler:
Fehler 1 Verwendung der nicht zugewiesenen lokalen Variablen "Einstellungen"

Bei der anderen Methode kommt folgendes an Fehlern:
Fehler 1 Die Methodengruppe "ToList" kann nicht in den Nichtdelegattyp "System.Collections.Generic.List<string>" konvertiert werden. Wollten Sie die Methode aufrufen?
Fehler 2 Für einen new-Ausdruck ist nach type (), [] oder {} erforderlich.
 
Du hast hoffentlich "ToList();" geschrieben und nicht "ToList;" desweitern prüfe bitte ob du den namespace System.Linq über "using System.Linq" eingebunden hast.
 
Liegt daran das du das Beispiel von toeffi 1 zu 1 kopiert hast, wenn du etwas lernen willst solltest du niemals etwas kopieren. Die Fehlermeldungen sind selbsterklärend...

/edit: müsste normal ToList<string>(); sein
 
Nöö muss nicht ToList<string>() sein, das impliziert der Compiler automatisch für dich heraus. Wendest es ja auf nen stirng-array an.
 
@Zhen:
Wäre ganz gut, wenn du uns deinen momentanen code einfach nochmal zeigst, damit wir sehen wo dein Problem liegt und dir erklären können wie du es besser machen kannst.
 
@Zhen

Wieso denn so kompliziert?
Geht doch auch viel einfacher und kürzer:
Code:
string text = File.ReadAllText("test.txt", Encoding.Default);
string constantString = (text.Split(new char[] { ';' }))[0].Trim();

Und schreiben kannst du dann auch mit File.WriteAllText().


Falls es dir nur um die Übung geht, dann solltest du dir einfach mal die Fehlermeldungen genau durchlesen, die der Debugger ausspuckt und evtl. mal danach Googlen oder bei MSDN die Methode nachschlagen, die die Exception geworfen hat. So lernst du dann auch, wie du deine Fehler selbst erkennen und beseitigen kannst.


@toeffi
Sorry, aber ich kapier nicht ganz welchen Vorteil ne Liste gegenüber nem Array an dieser Stelle bringen soll. Is doch Jacke wie Hose oder nicht?
 
Zuletzt bearbeitet:
Grantig schrieb:
@Zhen

Wieso denn so kompliziert?
Geht doch auch viel einfacher und kürzer:
Code:
string text = File.ReadAllText("test.txt", Encoding.Default);
string constantString = (text.Split(new char[] { ';' }))[0].Trim();

Und schreiben kannst du dann auch mit File.WriteAllText().


Falls es dir nur um die Übung geht, dann solltest du dir einfach mal die Fehlermeldungen genau durchlesen, die der Debugger ausspuckt und evtl. mal danach Googlen oder bei MSDN die Methode nachschlagen, die die Exception geworfen hat.

Nur schmeißt deine Lösung ne Exception wenn er nichts zu splitten hat ;) Die Lösung, die Splitoperation zwischen zu speichern ist schon nicht schlecht, so kann er auf ein Fehlsplit reagieren.
 
Zurück
Oben