Abbiamo già parlato del lavoro legato alla performance di Radical, i punti toccati non sono stati poi molti, il voro nocciolo della questione giro intorno ad un signore che si chiama “Ensure” e che vi permette di scrivere qualcosa del tipo:

class MyClass
{
   public void Foo( String arg )
   {
      Ensure.That( arg ).Named( () => arg ).IsNotNullNorEmpty();
   }
}

A runtime quello che succede è che se “arg” è null o empty vi beccate una simpatica eccezione con tutti i dettagli del caso, compreso:

  • classe;
  • metodo;
  • riga;
  • nome del file sorgente;

dove si è schiantato. Per fare tutto ciò bisogna avere a che fare con un paio di signori noti come StackTrace e StackFrame che hanno lo spiacevole difetto di essere onerosi.

Abbiamo quindi deciso di cambiare approccio e di abilitare quella funzionalità in Radical solo se Radical stesso è compilato in “debug”, altrimenti se è compilato in “release” l’eccezione conterrà tutte le informazioni tranne i dettagli derivati da StackTrace e StackFrame.

Questo comportamento è comunque controllabile all’avvio dell’applicazione:

public partial class App : Application
{
    public App()
    {
        Ensure.SourceInfoLoadStrategy = SourceInfoLoadStrategy.Skip;
    }
}

Dove i valori possibili di SourceInfoLoadStrategy possono essere:

  • Load: carica sempre le informazioni, è il comportamento di default se Radical è compilato in “debug”;
  • Skip: non carica mai le informazioni, è il comportamento di default se Radical è compilato in “release”
  • LazyLoad: cerca di posticipare il più possibile il caricamento delle informazioni con lo scopo di ridurre l’impatto sulle prestazioni;

.m