6

Nov

VS e i Nullable

Mi sono appena iscritto a .NET Lombardia su invito di Roberto. Forse qualcuno dei lettori mi conoscerà già da pierotofy.it, di cui sono da poco amministratore, o dal mio sito, totemslair.org, e per questo ho mantenuto anche qui il mio nick invece del mio nome reale. Ho dato uno sguardo a un po' tutti i post degli altri blog e devo dire che, al momento, non ho nulla di interessante o ragguardevole da scrivere, se non questa piccola presentazione che funge da saluto.

Tuttavia, prima di terminare questo post, volevo condividere una mia perplessità sul codice che visual studio genera automaticamente. Quando si crea una nuova sorgente dati attraverso il wizard dell'ide e si sceglie di creare un DataSet fortemente tipizzato, ci pensa VS a scrivere tutto il codice che lo gestisce. Anche se ora si tende ad usare sempre più spesso LINQ ed Entity Framework, penso che ci sia ancora qualcuno a cui interessa questo parere. Come dicevo, se provate a spulciare il sorgente di NomeDataSet.Designer, potrete notare che, nelle classi che derivano da DataRow, gli attributi di un record sono esposti tramite proprietà che presentano un codice simile a questo:

[code language="csharp"]public int Rank { get { try { return ((int)(this[this.tableCreatures.RankColumn])); } catch (global::System.InvalidCastException e) { throw new global::System.Data.StrongTypingException("errormsg", e); } } set { this[this.tableCreatures.RankColumn] = value; } }[/code]

Questo codice è circa lo stesso dalla versione 2005. Nel caso in cui sia impossibile eseguire un cast verso il tipo managed dell'attributo, viene lanciata un'eccezione. Questo approccio può essere utile o meno a seconda dei casi, ma mi è sempre sembrato che i tipi Nullable fossero stati pensati per essere usati estensivamente quando si ha a che fare con database e simili, poiché la loro natura permette di assegnarvi, oltre a tutti i valori caratteristici dei tipi atomici, anche null. Quindi avrei preferito che il codice auto generato fosse più simile al seguente:

public int? Rank {
      get {
      if (this.IsRankNull())
      return null;
      return (int)(this[this.tableCreatures.RankColumn]);
      }
      set {
      this[this.tableCreatures.RankColumn] = value;
      }
      }
by Totem's .NET Blog on 11/6/2010