Code

Quando un crash è meglio di un check

Lavorando su codice esistente mi sono imbattuto in un passaggio simile al seguente, supponendo che MyControlName sia un elemento di UI indispensabile e sempre presente: void Sample(){ Control uiControl = FindControl("MyControlName"); if (uiControl != null) { DoSomething(); }} Se quell’elemento è sempre presente nella UI, perché fare il check? Solo per essere sicuri che nel codice scritto da noi non venga sollevata un eccezione? Cosa succede se per qualche motivo il controllo non è più presente nella...

[Brainstorming] Anonymous DTO

Quando “indovinate chi” mi introdusse, ormai anni fa, al concetto di base degli Anonymous Types mi comparve subito un sorriso da buongustaio sulla faccia. Di contro l’aver scoperto poco più tardi che tali oggetti sono (giustamente) utilizzabili solo come variabili locali smorzarono di parecchio l’entusiasmo. Non che questo riduca il loro grande valore, ma so di non essere l’unico che, pur apprezzando i vantaggi dei DTO, non sia proprio veramente così felice ogni volta che si rende conto di doverne inserire uno “ad hoc” nella solution. Oggi però mi sono reso conto di un aspetto che forse ho sempre...

Eppur si muoveva…

Nel mio precedente post di stamattina riportavo un’alternativa per l’implementazione di INotifyPropertyChanged basata sullo StackTrace. Come si evince dallo stesso Namespace, la classe StackTrace viene utilizzata per scopi relativi alla diagnostica, quindi il primo pensiero quasi naturale é stato “ok, in release non andrà”! Poi penso... beh, ma Exception ha una property StackTrace che funziona anche in Release. Creo un progettino Console di prova, creo un po’ di metodi “a cascata” per riempire lo StackFrame. Compilo in Release, copio solo l’eseguibile… Funziona! Ohibò! Erroneamente convinto del risultato, passo all’implementazione. Il tempo stringe, vorrei “evadere”...

Yet another INotifyPropertyChanged implementation

Il post di Matteo mi aveva già stuzzicato, ma non conquistato del tutto per un paio di motivi. La variante riportata oggi da Corrado mi ha suggerito una possibile soluzione che poi si è rivelata forse ancora più “lineare” di quanto mi aspettassi, permettendo di centralizzare il tutto in un unica classe “helper” esterna, con i vantaggi che ne derivano. Così il “set” riportato da Corrado potrebbe diventare (chiedo venia per non aver ancora installato un code formatter per WLW): set {     if (!(value.Equals(userName))     { ...

Abc ...defg

Qualche giorno fa un mio cliente mi ha chiesto la disponibilità per supportare una persona nel suo percorso di formazione relativo a .NET e poche settimane prima mi era arrivata un'altra richiesta simile. In realtà negli ultimi due anni ho ricevuto diverse volte questa richiesta ed in un modo o nell'altro, a seconda di entrambe le disponibilità, credo e spero di essere sempre riuscito a condividere quelle nozioni apprese in questi anni grazie soprattutto ad UGIdotNET e Microsoft. Perché lo scrivo qui? Come praticamente è avvenuto in tutte queste occasioni stavo riscrivendo più o meno la solita mail con qualche...

Tra il dire e il fare...

...a volte passano mesi, anche anni! Più di due mesi fa ho scritto (dai, non è ancora da passato remoto...) che avrei provato a pubblicare qualche esempio relativo al breve video. Non mi andava proprio, però, di pubblicare degli esempi non "eseguibili" per l'assenza di alcune librerie referenziate (seppur OT rispetto all'argomento del video) ed ho preferito cercare un'altra soluzione che soddisfasse da un lato le esigenze "commerciali" e dall'altro quelle della community. MSDN Code Gallery, per motivi burocratico/amministrativi che evito di citare, si è rivelata un'ottima scelta e qualche settimana (?) fa ho pubblicato alcune librerie necessarie per far...

Model-View-Presenter in salsa Duz

Dovendo descrivere ad una persona le modalità con cui ad oggi utilizzo il pattern Model-View-Presenter, ho optato per la realizzazione di un (modesto) video. Nulla di particolarmente accademico, anzi lo scopo è decisamente più pratico; ma ho semplicemente pensato che dovendolo comunque realizzare potrebbe rivelarsi anche una base su cui prendermi gli insulti confrontarsi su UGIdotNET. Per fare qualche passo indietro, la mia difficoltà iniziale era relativa al (troppo) tempo che richiede un'implementazione "pura" di MVP con una view completamente passiva ed inoltre dal fatto che una view di questo tipo non permettesse di sfruttare a fondo i vantaggi specifici degli specifici...

ROTFC (alias La matematica dei Geeks #3)

Single a = 14.56F;Single b = 5.02F;Single sum = 19.58F;Console.WriteLine(a);Console.WriteLine(b);Console.WriteLine(a + b);Console.WriteLine(sum == (a + b)); //FalseConsole.WriteLine(sum.Equals(a + b)); //TrueConsole.ReadLine(); Single a1 = 14.56F;Single b1 = 254.02F;Single sum1 = 268.58F;Console.WriteLine(a1);Console.WriteLine(b1);Console.WriteLine(a1 + b1);Console.WriteLine(sum1 == (a1 + b1)); //FalseConsole.WriteLine(sum1.Equals(a1 + b1)); //FalseConsole.ReadLine(); Propongo una sessione per i prossimi Community Days: "Le addizioni".   Update: dimenticavo un tassello...

"My" review

Più cresce la complessità dell'architettura di una soluzione (niente di che, nel mio caso, ovviamente... ), più mi trovo a scrivere cose tipo: sample.InsertedBy = Authentication.AuthenticationManagerFactory.GetAuthenticationManager().CurrentUser; Il codice diventa sempre più dannoso per il tasto "." tanto più aumenta la profondità di annidamento degli AbstractFactory. Il pensiero è andato subito alla classe My introdotta in Visual Basic 2005 (anche se ormai uso al 90% C#) e stavo pensando ad una classe simile anche se rigorosamente internal (l'associazione di colori è puramente casuale) in cui riversare le chiamate ai metodi statici più gettonati, tipo: sample.InsertedBy = MyBiz.CurrentUser; Non so se siano in tanti ad aver adottato...

GpTiming @ CodePlex

Nato dopo l'idea della piattaforma forum/blog, GpTiming si è reso degno del suo nome spuntando la pole position, o meglio la pole publication, rispetto agli altri due progetti. (continua)

Math.Round()

Versione auto-censurata del post decisamente più spontaneo che avevo scritto prima di pranzo in WLW: Se usate Math.Round() e volete evitare che sia 1.5 che 2.5 vengano arrotondati a... 2 (o, per dirla con un esempio forse più chiaro, se volete evitare che 2.5 venga arrotondato per difetto a 2, mentre 3.5 venga arrotondato per eccesso a 4) allora scegliete una delle versioni in overload che contenga il parametro MidpointRounding ed impostatelo a MidpointRounding.AwayFromZero UPDATE: Dimenticavo... ovviamente il discorso vale anche per Convert.ToInt32()

C# ed il tipo base per gli Enum

Dovrebbe essere possibile utilizzare gli alias dei tipi del FX dovunque (per quanto ne so) ed invece se in C# scrivete: enum MyEnum : Int16{     ...} il linguaggio non riconosce l'alias e vi chiede di utilizzare enum MyEnum : short{     ...}

Come mi fa girare i polsi C#...

...quando mi restituisce un Int32 dalla divisione fra due Int32! Public Shared Function TestDiv() As Double     Dim a As Int32 = 12     Dim b As Int32 = 10     Return a / bEnd Function restituisce (giustamente IMHO) un Double = 1,2 public static Double TestDiv(){     Int32 a = 12;     Int32 b = 10;     return a / b;} restituisce comunque un Double ma uguale a 1, che nella crapa di un informatico potrebbe anche avere un suo perchè, ma nel mondo reale è un'eresia!

Assembly.GetTypes()

Ho tribulato non poco su un "passaggio" che alla fin fine (dopo averlo risolto!) si è rivelato tutto sommato banale: dovevo recuperare tramite Reflection i tipi contenuti in un assembly ma alcuni di questi tipacci derivavano da tipi base contenuti in un altro assembly ovviamente non referenziato. (continua)

Reflection e membri di classe base

Ieri mi è capitato di dover recuperare tutti i "campi" pubblici e non di una classe, della sua classe base, della base della sua base, della... vabè, ci siamo capiti! Non veniva volutamente considerata l'ereditarietà multipla (d'altronde non è contemplata neanche nelle CLS). Il modo che ho trovato io, che probabilmente sarà ben lungi dall'essere definito come il migliore, è semplicemente quello fare la ricerca in tute le classi base fino ad arrivare al null. Un pochino di attenzione hanno meritato i campi protected, che sono giustamente visibili nella classe derivata, ma lo sono anche nella classe base. Il flag BindingFlags.NonPublic giustamente recupera...