break übere mehrere ebenen



  • Wie mache ich ein break über mehrere Ebenen in C#?



  • Gar nicht. Wenn die Verschachtelung zu tief wird, lager die Codestücke in einzelne Funktionen aus und returne von dort aus.



  • oh, mann. Ich haße C#. 😉

    Trotzdem Danke.



  • den Dino goto benutzen 😃

    wenn das Ding schon in C# implementiert wurde dann sollte es auch benutzt werden 😃

    (ich würd's nicht tun 😉 )



  • Online schrieb:

    (ich würd's nicht tun 😉 )

    aber sicher.... 😃

    man kann für so einen break auch exceptions vergewaltigen.



  • hehe, ihr solltet ein Buch schreiben.
    Ich seh schon das cover vor mir: ".NET - the best practice".



  • Xqgene schrieb:

    ...
    man kann für so einen break auch exceptions vergewaltigen.

    class werfeBreak : Exception
        {
        }
    
    	class Class1
    	{
    		[STAThread]
    		static void Main(string[] args)
    		{
                try
                {
                    for(int i = 0; i < 5; i++)
                    {
                        //...
                        for(int j = 0; j < 5; j++)
                        {
                              //...
                            if(j == 2)
                                throw new werfeBreak(); 
                        }
                    }
                }
                catch(werfeBreak)
                {
                }
    		}
    	}
    

    😃 😉



  • hm,

    man könnte das natürlich auch Methodenübergreifend machen.

    class Rentenkasse
    		{
    			public double altersvorsorge;
    
    		}
    		Rentenkasse rentenkasse;
    		internal class GelderVeruntreuen: Exception
    		{
    			private double _betrag;
    			public double notwendigerBetrag(){return _betrag;}
    			public GelderVeruntreuen(double bedarf)
    				:base(bedarf.ToString())
    			{
    				_betrag=bedarf;
    			}
    
    		}
    		private void NeueAmtsperiode(double Steuergelder)
    		{
    			Alltag(Steuergelder);
    		}
    		private void Alltag(double Steuergelder)
    		{
    			try
    			{
    
    				while("Regierung" != "Ehrlich" ) // eindeutige endlosschleife
    				{
    					verschwendeSteuergelder(ref Steuergelder);
    				}
    			}
    			catch(GelderVeruntreuen Amtshandlung)
    			{
    				rentenkasse.altersvorsorge-= Amtshandlung.notwendigerBetrag();
    				Alltag(Amtshandlung.notwendigerBetrag());
    			}
    		}
    		private void verschwendeSteuergelder(ref double Steuergelder)
    		{
    			if("Steuerzahler" != "merkt was")
    			{
    				Steuergelder-=100;
    				if(Steuergelder < 0)
    					throw (new GelderVeruntreuen(10000));
    			}	
    			else
                           {	
                            Verschleiern();
    
                            verschwendeSteuergelder(ref double Steuergelder);
                             }
    		}
    	}
    


  • also, wie ich sehe, habt ihr meine breakmethode richtig verstanden! 😉



  • Ich hatte es jetzt mit folgender Technik gelöst, aber ein Exception zu werfen und diese dann abzufangen ist ja noch besser. Danke für den Tip.

    bool shouldBreak = false;
    for(int i = 0; i < 5; i++) 
    { 
    	//... 
    	for(int j = 0; j < 5; j++) 
    	{ 
    		//... 
    		if (j == 2) shouldBreak = true;
    		//... 
    		if (shouldBreak) break;
    	} 
    	if (shouldBreak) break;
    }
    


  • Sag mal, hast du nen Schuss?? Das meinst du nicht ernst, oder?



  • meinst du seine jetzige Lösung, oder die Exceptions?



  • Findest du es besser extra eine Variable für einen Flag anzulegen und diese dann immer nach jedem Durchgang auf jeder Ebene der verschachtelten Schleifen zu überprüfen (siehe meinen Ansatz), als einfach eine Exception zu werfen und diese dann zu behandeln?



  • Ich habe dir eine bessere Lösung gesagt, die nicht nur speziell wegen diesem Problem generell zu besserem Code führt.
    Und das mit der Exception ist
    - unbeschreiblich langsam (das kann man in Worten nicht ausdrücken)
    - ein verdammter Scherz gewesen?!

    Und dass die Lösung mit der bool Variable auch nicht der Hit ist, hast du ja selber schon erkannt. Wenn du über mehrere Ebenen springen willst, heißt dein Sprungbefehl fast immmer: return



  • machs mit goto 😃



  • Achso du redest jetzt wieder von goto. Sag das doch gleich.



  • Nein rede ich nicht. Ich rede von return. >> return <<

    Wenn du z.B. 2 Ebenen zurückspringen musst, dann lagere diese zwei inneren Schleifen in eine eigene Methode aus und returne von dort.

    - goto lässt sich _immer_ vermeiden, und es ist auch fast immer sinnvoll, das zu tun.
    - deine Lösung mit dem bool ist wohl auch nicht sehr schön.
    - das mit den Exceptions ist sowieso nicht ernst gemeint.



  • Ich hab die verschiedenen Techniken mal ausprobiert und kam zu dem Ergenis, dass goto der Exception gegenüber mir 21% mehr Performance eingebracht hat und dein Vorschlag mit dem return den ich jetzt auch nehmen werde brachte nochmal weitere 12%. Danke für den Tip.



  • Ich habe vor ein paar Tage ein goto gebraucht. Jedenfalls habe ich keinen besseren Weg gefunden, der nicht total umständlich war.



  • Helium schrieb:

    Ich habe vor ein paar Tage ein goto gebraucht. Jedenfalls habe ich keinen besseren Weg gefunden, der nicht total umständlich war.

    manchmal ist sogar ein einfaches goto besser als eine riesiege wulst von Funktionen um ein workaround zu erarbeiten. das ist ja auch nicht unbedingt alls su übersichtlich.
    Der Einsatz muss einem nicht leid tun. goto ist ja nicht dafür da, um mal einfach in der Syntax rumzuliegen.

    bevor hier wieder von irgendwo ein "aber" herschallt:
    es kommt nicht drauf an das mans einsetzt, sondern wo und vor allem wie man es einsetzt!



  • AndreasW schrieb:

    hm,

    man könnte das natürlich auch Methodenübergreifend machen.

    class Rentenkasse
    		{
    			public double altersvorsorge;
                
    		}
    		Rentenkasse rentenkasse;
    		internal class GelderVeruntreuen: Exception
    		{
    			private double _betrag;
    			public double notwendigerBetrag(){return _betrag;}
    			public GelderVeruntreuen(double bedarf)
    				:base(bedarf.ToString())
    			{
    				_betrag=bedarf;
    			}
    
    		}
    		private void NeueAmtsperiode(double Steuergelder)
    		{
    			Alltag(Steuergelder);
    		}
    		private void Alltag(double Steuergelder)
    		{
    			try
    			{
    				
    				while("Regierung" != "Ehrlich" ) // eindeutige endlosschleife
    				{
    					verschwendeSteuergelder(ref Steuergelder);
    				}
    			}
    			catch(GelderVeruntreuen Amtshandlung)
    			{
    				rentenkasse.altersvorsorge-= Amtshandlung.notwendigerBetrag();
    				Alltag(Amtshandlung.notwendigerBetrag());
    			}
    		}
    		private void verschwendeSteuergelder(ref double Steuergelder)
    		{
    			if("Steuerzahler" != "merkt was")
    			{
    				Steuergelder-=100;
    				if(Steuergelder < 0)
    					throw (new GelderVeruntreuen(10000));
    			}	
    			else
                           {	
                            Verschleiern();
    
                            verschwendeSteuergelder(ref double Steuergelder);
                             }
    		}
    	}
    

    *rofl* Ich pack mich weg 😃 👍


Anmelden zum Antworten