Nella costruzione delle classi che compongono le nostre applicazioni, in maniera molto naturale e immediata utilizziamo molto spesso i tipi primitivi come interi e stringhe. La verità è che questo molto spesso è impreciso e può portare ad errori riscontrabili solo a runtime. Vediamo un semplice esempio: class Program { static void Main(string[] args) { var clien ...
C#
Usare le nuove Tuple C# 7
La nuova versione di C# rilasciata con VS2017 aggiunge un nuovo tipo di Tupla estremamente più utlizzabile e chiara della Tuple precedentemente presente nel Framework. Per distinguerla dalla Tupla classica il nuovo tipo si chiama ValueTuple e la sua più grande utilità è quella di poter dare un nome agli elementi. Per spiegarci meglio vediamo un esempio di codice, ricordate di i ...
Validazione degli argomenti e yield return con C# 7
La validazione degli argomenti nei metodi che utilizzano il costrutto "yield return" è un tema che abbiamo già affrontato in questo blog. Tuttavia oggi C# 7 e VS2017 ci permettono di migliorare quell'approccio e rendere il nostro codice ancora più sicuro. Ricordiamoci che per effettuare la validazione in un metodo che utilizza lo "yield return" è necessario spezzarlo in due par ...
Forzare la localizzazione dei ToString()
La localizzazione è uno dei problemi che un qualunque sviluppatore si troverà prima o poi ad affrontare. Sviluppando sul proprio pc o server è molto semplice dare per scontato che metodi come il ToString() facciano esattamente quello che ci aspettiamo convertendo i valori nel formato del nostro pc o server. Chiaramente questo potrebbe creare problemi non appena spostiamo il nos ...
Web Forms e dependency injection
La dependency injection è una funzionalità che non è supportata nativamente dalle web form. Tuttavia utilizzando la libreria Autofac è possibile in modo molto semplice e veloce utilizzare la dependency injection nei progetti web di tipo web form. Iniziamo con l'installare i due pacchetti nuget: Autofac Autofac.Web Registriamo i moduli necessari per il corretto funzionamento d ...
Caricare un file sul blob storage azure
Caricare un file del blob storage è molto semplice e si può fare il tutto con poche righe di codice. Preliminare all'esecuzione del codice è un account azure su cui abbiamo già attivato il servizio di storage, per intenderci quello dello screenshot sotto. Creato un progetto di qualunque tipo, ad esempio web o console application, è innanzitutto necessario installare i seguen ...
Validazione degli argomenti e yield return
In un articolo precedente abbiamo spiegato l'utilizzo del costrutto "yield return", oggi vediamo come validare in maniera efficace gli argomenti di un metodo che utilizza al suo interno lo yield return, in particolare mostreremo la strategia che viene utilizzata nell'implementazione di LINQ. Molti metodi di LINQ hanno un'esecuzione differita: le query non vengono eseguite nel m ...
Currying e applicazione parziale di funzioni
In C# siamo abituati a definire ed utilizzare funzioni che hanno parametri multipli in ingresso, ad esempio l'addizione. Se per qualche motivo volessimo o avessimo solamente funzioni che prendono in input un unico parametro potremmo comunque rappresentare ed utilizzare le funzioni che oggi definiamo con più parametri? La risposta è sì e questo procedimento di riduzione delle fu ...
Closure e variabili catturate
In C# è possibile definire delle funzioni in linea e utilizzarle come tutte le altre variabili ovvero passarle come parametri ai metodi, restituirle come risultato di un metodo e in più, essendo funzioni, possiamo invocarle. Uno scenario ricorrente in questi casi, sicuramente familiare a chi ha utilizzato LINQ in una delle sue tante forme, è quella di utilizzare all'interno di ...
Approfondimento su Linq - Metodo Select pt 1
Cominciamo ad analizzare oggi il metodo LinqToObjects Select. Vediamo i due overload presenti public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSour ...