23. august 2008 - 16:07Der er
14 kommentarer og 1 løsning
return uden for if sætning
Hej
Jeg er igan med at lave et kortspil. Mit problem er når jeg har kørt et kort igennem if sætningen så kommer de nye oplysninger ikke uden for min if sætning.
if (kloever1.Checked) { kortEtKuloer = kortEt + "kloever"; }
Det er kortEtKuloer som jeg gerne vil kunne bruge uden for if sætningen med de nye oplysninger. Er der info nok og er der nogen som kan hjælpe?
som du har stillet det op dér må du have oprettet variablen kortEtKuloer uden for din if-sætning og derfor vil den altid findes i den pågældende metode - altså vil du kunne bruge kortEtKuloer uden for if.
Variablen bliver fyldt på, som den skal, og når den er færdig i if sætningen stopper den. Variablen ser ud som den skal i if sætningen, men ikke i resten af programmet.
hvis variablen ændrer sig inde i if-sætningen er der noget der ændrer den tilbage igen - det burde du let kunne se hvis du kører debug helt igennem. Ellers kom med noget mere kode.
Hvis jeg flytter MessageBox.Show ind i if sætningen så virker det som det skal. Men jeg skal bruge de oplysninger som kommer i if sætningen andre steder i applikationen.
der er ingen måde hvorpå at kortEtKuloer kan miste sin værdi - så kommer du ind i if-sætningen vil din messagebox også vise den værdi der sættes. Men skal du bruge værdien andre steder i applikationen er du nødt til at initialisere din variabel et andet sted, fx før public Form1(), eller på anden måde gemme den. variabler "virker" jo kun i det scope de sættes i - i dette tilfælde i controlKnap_Click.
Hvis jeg skrev konge i [kort1.text] og markerede [kloever] så ville [kortEtKuloer]-variablen indeholde (kongekloever) efter den har været igennem if sætningen. Hvis jeg så skulle køre [kortEtKuloer] i en anden if sætning ville den ikke indeholde (kongekloever). Jeg vil gerne kunne køre den i flere "scopes". Men hvis det ikke kan lade sig gøre at trække den ud af if sætningen, må du gerne hjælpe mig med at lave en public static string (eller hvad der skal til). Jeg er ikke med på hvordan det foregår i en win applikation.
Øhm... I den kode du poster der, vil dit kort holde sin værdi efter exit af if sætningen som Keysersoze siger.
Ergo giver tingene du siger ikke mening, så der må være noget mere kode, nogle flere metoder osv.
Og vil desuden mene det er en dum ide at hoppe over i at bruge "public static strings"... Du skal gøre dig klar hvordan scope skal være...
Er det en enkelt form du starter op som skal arbejde med det her, så et field (hvis det godt må være grimt) eller vedhæft en controller til din form... skal du have flere forme inden for samme application der skal have fat i samme information, så IMO singleton + fields + properties, Men en static class vil også virke her... skal din information deles mellem flere instanser af samme application bliver ting straks mere kompliceret...
Men zumma zumarium...
public partial class Form1 : Form { private static string staticField; private string field;
public Form1() { InitializeComponent(); }
private void controlKnap_Click(object sender, EventArgs e) { // kortEtKuloer oprettes, og starter sin livscyklus. string kortEtKuloer = string.Empty;
if (kloever1.Checked) { // en ny værdi assignes til kortEtKuloer. kortEtKuloer = kort1.Text + "kuloer"; }
MessageBox.Show(kortEtKuloer); field = kortEtKuloer; staticField = field; // kortEtKuloer dør med scope, og makeres for GC. // field lever uden for metodens scope, og overlever derfor. }
private void controlKnap2_Click(object sender, EventArgs e) { // kortEtKuloer oprettes, og starter sin livscyklus, DETTE ER EN ANDEN kortEtKuloer end i controlKnap_Click. string kortEtKuloer = string.Empty;
// kortEtKuloer er aldrig blevet sat til noge her, og er derfor "" lige meget hvor mange gange controlKnap_Click metoden har kørt' // har controlKnap_Click kørt er field derimod noget andet. MessageBox.Show("kortEtKuloer: " + kortEtKuloer + " and field: " + field); field = kortEtKuloer; staticField = field; // kortEtKuloer dør med scope, og makeres for GC. // field lever uden for metodens scope, og overlever derfor. // field er nu tom. }
~Form1() { //formens scope dør, og field bliver makeret for GC. //staticField overlever dog indtil AppDomainet lukkes, og vil kunne indeholde sin værdi på tværs af instanser. } }
SÅ... du må mangle noget kode i det scenario hvor det ikke virker for dig.
md craig - Nu vil jeg lige prøve det som du har beskrevet, og så får du svar imorgen. Men jeg har ret meget mere kode at vise, så jeg forstår heller ikke helt hvorfor det ikke fungerer.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.