Vordefinierte globale Variablen?



  • Hallo Leute,

    ich habe einen selbstgemachten Codeausschnitt zur Berechnung der Dauer eines umschlossenen Bereichs. Die Dauer wird dann in der Konsole ausgegeben. Bei sehr kurzen Zeiten wird immer 0 Ticks ausgegeben. Wird die Methode vielfach aufgerufen, wird die Konsole mit der ausgegebenen Dauer "zugespamt". Da immer der Wert 0 aufgeführt wird, lässt sich in der Konsole keine Veränderung ablesen. Man sieht also nicht, ob neue Zeiten ausgegeben werden, oder momentan die Ausgabe stillsteht.

    Meine Idee ist nun, einen Counter in die Ausgabe einzubauen. Da es ein vorgefertigter Codeausschnitt ist, will ich dem Programmierer nicht den Aufwand machen, noch eine globale Variable zu initialisieren.

    Die Frage ist nun, ob es in C# bereits vordefinierte globale Variablen gibt, auf die von überall zugegriffen werden kann.

    Danke.



  • Ape schrieb:

    Die Frage ist nun, ob es in C# bereits vordefinierte globale Variablen gibt, auf die von überall zugegriffen werden kann.

    Nein, es gibt überhaupt keine globalen Variablen in C#.
    Und irgendwelche public static Variablen die jeder nach Lust, Laune und Einsatzzweck verändern kann gibt es auch nicht.

    Ich verstehe Deine Erklärung aber auch nicht wirklich. Was ist nun selbstgemacht, was vorgefertigt? Warum gibst Du nicht einfach den counter aus? Zeig am besten ein bisschen Code.



  • So sieht der Code-Snippet momentan aus:

    <![CDATA[#region ---------- ZEITMESSUNG START ----------
    			System.DateTime dtZeitmessungStart = System.DateTime.Now;
    			#endregion ---------- ZEITMESSUNG START ----------
    
    			$selected$ $end$
    
    			#region ---------- ZEITMESSUNG STOPP ----------
    			{
    				System.DateTime dtZeitmessungDauer = new System.DateTime(System.DateTime.Now.Ticks - dtZeitmessungStart.Ticks);
    				System.String strZeitmessungKlasse = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;
    				System.String strZeitmessungMethode = System.Reflection.MethodBase.GetCurrentMethod().Name;
    				System.String strZeitmessungDauerS = string.Format("{0:00}s", dtZeitmessungDauer.TimeOfDay.TotalSeconds);
    				System.String strZeitmessungDauerMS = string.Format("{0:00000}ms", dtZeitmessungDauer.TimeOfDay.TotalMilliseconds);
    				System.String strZeitmessungDauerTKS = string.Format("{0:000000000}tks", dtZeitmessungDauer.TimeOfDay.Ticks);
    				System.String strZeitmessungDauer = String.Format("Klasse: {0}, Methode: {1}\nDauer: {2} | {3} | {4}",
    					strZeitmessungKlasse, strZeitmessungMethode, strZeitmessungDauerS, strZeitmessungDauerMS, strZeitmessungDauerTKS);
    				Console.WriteLine(strZeitmessungDauer);
    			}
    			#endregion ---------- ZEITMESSUNG STOPP ----------
    

    Es macht keinen Sinn einen lokalen Counter zu initialisieren, da dieser ja zurückgesetzt wird, wenn die Methode erneut aufgerufen wird. Deswegen sollte dieser "global" zugänglich sein. Ich will ihn auch nicht an einer anderen Stelle initialisieren müssen. Die komplette Logik sollte mit diesem Snippet ausgeführt werden.

    Du hast Recht µ. Es gibt tatsächlich keine globalen Variablen in C#. Hab ich bisher noch gar nicht getestet. 😛
    Ich kann mir aber nicht vorstellen, dass es in .NET nicht irgendwelche statische Platzhalter gibt, die man dafür missbrauchen kann. 🙄



  • Hallo Ape,

    nimm für die Zeitmessung besser gleich die Stopwatch-Klasse (da diese auch eine höhere Genauigkeit hat, s z.B. Stopwatch vs. using System.DateTime.Now for timing events).

    Für wen soll dieses Snippet denn sein? Ich selber würde eher eine Methode dafür anbieten, im Sinne von

    // Aufruf
    WatchTime(() => SomeFunctionWithParameters(42, "Hallo"));
    
    // Methode
    void WatchTime(Action action)
    {
      Stopwatch stopwatch = Stopwatch.StartNew();
    
      action();
    
      Stopwatch.Stop();  
    
      Console.WriteLine("Elapsed Time: {0} ms", stopwatch.ElapsedMilliseconds);
    }
    

    Du könntest diese Methode auch in einer statische Klasse packen und dort dann eine statische Membervariable anlegen...



  • Danke Th69 für die Antwort.

    Ich wusste nicht, dass Stopwatch genauer als DateTime ist. Ich habe den Code jetzt darauf umgeschrieben.

    Die Möglichkeit mit der statischen Methode klingt auch nicht schlecht. Ich finde es jedoch besser mit einem Code-Snippet, da die Zeitmessung ja nur zu Debug-Zwecken verwendet wird. Ausserdem ist ein Code-Snippet Projektübergreifend anwendbar, wodurch man weniger Aufwand als mit extra Klassen oder DLLs hat.

    Ich glaube, ich lass das mit dem Counter einfach weg. Ist ja nicht so wichtig. Hätte mich nur gerne interessiert, ob so etwas in C#/.NET möglich wäre.

    Trotzdem Danke.



  • BTW: Stopwatch ist nicht nur genauer, sondern sollte auch unabhängig von Änderungen der Systemzeit sein.
    "Sollte" deswegen, weil MS leider auch nicht immer alles korrekt implementiert. Da aber auf den meisten Systemen wohl ein High-Performance-Counter verfügbar ist, dieser unabhängig von der Systemzeit ist und bevorzugt verwendet wird, sollte es OK sein.


Log in to reply