9 november 2011

Over lijnen en nieuwe lijnen

In Visual Basic kan je op veel manieren een nieuwe lijn beginnen, bijvoorbeeld:

MessageBox.Show("Dag " + vbNewLine +
                "Meneer, " + Environment.NewLine +
                "Alles " + ControlChars.NewLine +
                "Naar wens?")

Vooral de klasse ControlChars is handig, want die bevat ook nog handige properties om tabs, formfeeds, … toe te voegen.

Wil je bovenstaand voorbeeld omzetten naar C#, dan blijven twee opties over:

MessageBox.Show("Dag \r\n" +
                "Meneer " + Environment.NewLine +
                "Alles \n" +
                "Naar wens?");

Ofwel werk je met Environment.NewLine, dan voeg je het nieuwelijn-teken toe dat voor het platform (in mijn geval Windows 7) gangbaar is. Ofwel werk je met de codes die vanuit de C-taal gegroeid zijn: \r\n is voor windowsplatformen het nieuwelijnteken voor tekstbestanden, \n is dat voor unixvarianten. Dit laatste werkt echter wel voor het voorbeeld hierboven.

En wat als je toch wil volharden en gebruik wil maken van ControlChars? Wel, dan moet je in eerste instantie de namespace Microsoft.VisualBasic toevoegen aan je C#-project. Dit kan door te rechtsklikken in je project op References en vervolgens via Add Reference het bestand Microsoft.VisualBasic.dll toe te voegen. Vervolgens importeer je deze namespace bovenaan in je bestand:

using Microsoft.VisualBasic;

En nu kan je deze klasse gebruiken in je C#-programma. Belangrijk nadeel: je moet een hele assembly (dll) toevoegen en laden in het geheugen omwille van slechts één klasse. Daarom kan je eventueel de raad uit dit artikel volgen en je eigen ControlChars maken, eventueel in een aparte namespace (bv. KrisHermans.Utils):

namespace KrisHermans.Utils
{
    public class ControlChars
    {
        public const string CrLf = "\r\n";
        public const string NewLine = Environment.NewLine;
        public const char Cr = (char)13;
        public const char Lf = (char)10;
        public const char Back = (char)8;
        public const char FormFeed = (char)12;
        public const char Tab = (char)9;
        public const char VerticalTab = (char)11;
        public const char NullChar = (char)0;
        public const char Quote = (char)34;
    }
}

8 november 2011

Tijdsduur meten van bewerkingen

Stel dat je in een programma de duur van een operatie wil meten, bijvoorbeeld:

  • hoelang het duurt om een bestand in te lezen;
  • hoelang een databasebewerking duurt;
  • hoelang het tekenen van een complexe figuur duurt;

Een voor de hand liggende aanpak zou zijn om gebruik te maken van twee instanties van DateTime en hiervan het verschil (een TimeSpan object) af te drukken, zoals:

DateTime start = DateTime.Now;
FooMethodToMeasure();
DateTime stop = DateTime.Now;
Console.WriteLine("Duur {0} msec", (stop - start).TotalMilliseconds);

Deze manier van werkwijze zou echter niet nauwkeurig zijn (bron 1, bron 2), en daarom gebruik je beter de StopWatch klasse, die rechtstreeks via het besturingssysteem een timer voorziet. Let op: je moet wel de System.Diagnostics namespace importeren.

Stopwatch watch = new Stopwatch();
watch.Start();
FooMethodToMeasure();
Console.WriteLine("Duur {0} msec", watch.ElapsedMilliseconds);
watch.Stop();