February 2004 - Posts

Ik kan niet wachten...
Wed, Feb 25 2004 9:12 AM

...op whidbey en in dit geval c# 2.0

met het validatie framework van e-platform loop ik tegen het feit aan dat valuetypes niet geboxed kunnen worden naar null.
hierdoor kan ik niet zien of een valuetype is geinitialiseerd.

Om dit verhaal wat duidelijker te maken nu mijn praktijk probleem waar ik tegenaan loop:
ik wil met het validatieframework een veld uit de database valideren dat optioneel is en een valuetype is.
bijvoorbeeld een byte (System.Int16) voor het veld leeftijd. Maar als er een leeftijd is ingevuld, dan moet deze minimaal 16 jaar zijn.

Wanneer een gebruiker op een scherm geen leeftijd invult is dit correct want het veld is optioneel.
In de business laag gaat het validatieframework alle velden van het scherm valideren en komt bij Leeftijd.

Leeftijd is niet null dus wordt het gevalideerd. Default heeft een System.Int16 een waarde van 0.
Maar de validatieregels zeggen dat de minimale leeftijd 16 moet zijn. Er treedt een validatie error op. En terecht.

Het validatieframework kan dus niet omgaan met optionele velden die valuetype zijn en die een waarde moeten hebben van > 0.
Helaas kan ik hier niets aan doen. De enige oplossing die ik kon bedenken is een flag bijhouden wanneer een veld veranderd is. (dirty flag)
alleen wanneer het veld dirty is, deze valideren.

Het alternatief staat mij beter aan: wachten op c# 2.0. Hier zijn er alleen nog maar ReferenceTypes.
Waardoor de Primitive Types in .NET 1.1 wel null of NaN kunnen zijn zijn.

 

Waarom gaat dit fout ?
Wed, Feb 18 2004 1:16 PM

Waarom gaat dit fout ? En hoe moet het wel ?

string x = double.MinValue.ToString();
double y = Convert.ToDouble(x);

de foutmelding is:
An unhandled exception of type 'System.OverflowException' occurred in mscorlib.dll
Additional information: Value was either too large or too small for a Double.

Hiermee gaat het ook niet goed:
string x = double.MinValue.ToString(“F“);

Webprojecten en sourcesafe undocumented
Thu, Feb 12 2004 11:17 AM

Met VS.NET 2003 en sourcesafe 6.0d komt je webproject gelijk te staan met de solution folder in sourcesafe. Vaak zijn ook referenties van webprojecten kwijt. Terwijl dit in VS.NET 2002 perfect ging.

Oplossing:
in de registry: ga naar
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\SourceControl]
zet 'DoNotCreateSolutionRootFolderInSourceControl' op 1.

Alles werkt dan weer zoals je wil. Bij de optie Add solution to SourceControl wordt ook weer gewoon gevraagd waar je de projecten in sourcesafe wil hebben. Deze oplossing staat niet in de documentatie !

Improving .NET Application Performance & Scalability
Tue, Feb 10 2004 10:17 AM

in maart brengt Microsoft een nieuw patterns & practices boek uit:

Improving .NET Application Performance & Scalability

Hier is al de beta2 te downloaden

 §9
The number of people working on this project

§900
The number of pages of guidance for designing, implementing and tuning high performance and scalable .NET distributed applications

§900,000
Budget for development of this guide
 
§This is much more than a whitepaper
Goedkoop NL domeinnaam
Fri, Feb 6 2004 3:22 PM

http://www.registreernujouw.nl/

10 Euro per jaar

10 Euro eenmalig

CLI is Open Source
Fri, Feb 6 2004 2:26 PM

Altijd al eens willen weten hoe Microsoft een class in het .NET framework  heeft opgezet ?
Met tools als Anakrino of Reflector is het mogelijk om de IL te decompilen.

Makkelijker is om gewoon even de source te downloaden !

Omdat de Common Language Infrastructure een standaard is door ECMA gekeurd kan je deze hier downloaden.

Performance Measurement in .NET part 2
Thu, Feb 5 2004 3:38 PM

'TestHarness' het framework van Nick Wienholt is interessant. Er zijn uiteraard meer van dit soort iniatieven.

Hier is Benchmark.cs te downloaden: http://www.yoda.arachsys.com/csharp/benchmark.html

als je deze in een console applicatie hangt kan je het attribuut [Benchmark] boven een method zetten (zie code onderin het artikel)(zelfde voorbeeld als bij TestHarness)
Er zitten wel wat eisen aan een method. Maar het resultaat is het volgende:

Benchmarking type FillingArrayList
  Method1              00:00:00.9914256
  Method2              00:00:01.3619584
  Method3              00:00:00.7210368
  Method4              00:00:04.2160624
Press any key to continue

Niet slecht, maar bij TestHarness zie je in 1 oogopslag het resultaat. Hier moet je zelf nog wat 'analyseren'.
Bij TestHarness is het nadeel dat er gebruik wordt gemaakt van DateTime datatype.
Hierdoor kan het zijn, als je een te laag aantal keer itereert door een method de start en eindtijd hetzelfde zijn.
Een exception is het gevolg.

De code voor BenchMark:

using System;

using System.Collections;

 

public class FillingArrayList

{

      const int NumberIterations = 50000000;

 

      [Benchmark]

      public static void Method1()

      {

            string x = "";

            int j = 0;

            for (int i = 0;i < NumberIterations;++i)

            {

                  if (x.Length>0)

                  {

                        j++;

                  }

            }

      }

 

      [Benchmark]

      public static void Method2()

      {

            string x = "";

            int j = 0;

            for (int i = 0;i < NumberIterations;++i)

            {

                  if (x!=string.Empty)

                  {

                        j++;

                  }

            }

      }

 

      [Benchmark]

      public static void Method3()

      {

            string x = "piet";

            int j = 0;

            for (int i = 0;i < NumberIterations;++i)

            {

                  if (x.Length>0)

                  {

                        j++;

                  }

            }

      }

 

      [Benchmark]

      public static void Method4()

      {

            string x = "piet";

            int j = 0;

            for (int i = 0;i < NumberIterations;++i)

            {

                  if (x!=string.Empty)

                  {

                        j++;

                  }

            }

      }

}

 

Performance Measurement Framework in .NET
Thu, Feb 5 2004 3:05 PM

Performance Measurement in .NET

Bij het coderen komen nogal eens vragen op als:

Is manier A nu sneller dan manier B of andersom ?

Of: Ik weet dat manier A gebruikt dient te worden want die is sneller dan B, maar hoeveel scheelt het nu daadwerkelijk ?

 

Om op dit soort vragen antwoord te geven heeft Nick Wienholt een Performance Measurement Framework geschreven.

http://www.dotnetperformance.com/downloads/harnesscode.zip

(Source included)

 

In dit generieke testframework kan je heel eenvoudig testen uitvoeren zoals hierboven beschreven.

Nick heeft er ook een artikel bij geschreven:

http://www.dotnetperformance.com/downloads/harness.doc

 

In korte tijd zijn hierin tests te coderen die veelzeggend zijn:

De output kan gekozen worden bijvoorbeeld een graph, messagebox of naar een bestand.

 

Hieronder volgt een simpele test mbt string.empty of string.length gebruiken:

De grafiek onder de code laat genoeg resultaat zien. (bij een iteratie van 50 miljoen x per method)

 

using System;

using DotNetPerformance;

 

namespace Test_Example

{    

      public class StringTest

      {

            public TestResult[] RunTest()

            {    

                  const int numberIterations = 50000000;

                  const int numberTestRuns = 5;

                 

                  TestRunner tr = new TestRunner(numberIterations, numberTestRuns);

                  TestRunner.TestCase testCases = null;

                  testCases += new TestRunner.TestCase(this.Method1);

                  testCases += new TestRunner.TestCase(this.Method2);

                  testCases += new TestRunner.TestCase(this.Method3);

                  testCases += new TestRunner.TestCase(this.Method4);              

                 

                  return tr.RunTests(testCases);

            }

 

            public void Method1(Int32 NumberIterations)

            {

                  string x = "";

                  int j = 0;

                  for (int i = 0;i < NumberIterations;++i)

                  {

                        if (x.Length>0)

                        {

                              j++;

                        }

                  }

            }

 

            public void Method2(Int32 NumberIterations)

            {

                  string x = "";

                  int j = 0;

                  for (int i = 0;i < NumberIterations;++i)

                  {

                        if (x!=string.Empty)

                        {

                              j++;

                        }

                  }

            }

 

            public void Method3(Int32 NumberIterations)

            {

                  string x = "piet";

                  int j = 0;

                  for (int i = 0;i < NumberIterations;++i)

                  {

                        if (x.Length>0)

                        {

                              j++;

                        }

                  }

            }

 

            public void Method4(Int32 NumberIterations)

            {

                  string x = "piet";

                  int j = 0;

                  for (int i = 0;i < NumberIterations;++i)

                  {

                        if (x!=string.Empty)

                        {

                              j++;

                        }

                  }

            }

      }

}