AntonioPelleriti.it [aka z9]

I code, therefore I am

NAVIGATION - SEARCH

Articolo IoProgrammo 204: Microsoft Bot Framework.NET

Su IoProgrammo numero 204(Luglio 2016), trovate un mio articolo dedicato al Microsoft Bot Framework, con un esempio per  creare un bot per Skype

 Titolo di copertina:

L'interfaccia della tua app è una voce su skype, Impara a utilizzare il Microsoft Bot Framework, semplice ed innovativo





Espressioni Lambda e ricorsione

Una espressione lambda può essere ricorsiva. Quindi è possibile invocare la stessa funzione, assegnando l'espressione lambda ad una variabile, e naturalmente assicurandosi che ci sia sempre una condizione di uscita, per evitare che la ricorsione sia infinita.

Ecco un esempio che calcola il classico fattoriale di un numero.

Il fattoriale di un numero n è il prodotto dei numeri positivi minori o uguali a n. Per definizione, se n è = 0 il fattoriale di n è 1.

Per esempio il fattoriale di 5 è uguale a 5*4*3*2*1 = 120.

Ed ecco l'implementazione mediante una espressione lambda.

Func<int,int> fattoriale = null;
fattoriale = (n) => n==0 ? 1: n*fattoriale(n - 1);		

int result=fattoriale(5);	
Console.WriteLine(result);

L'espressione lambda è assegnata alla variabile fattoriale, ed al suo interno invoca se stessa.





Articolo IoProgrammo 203: le .NET Scripting API di Roslyn

Su IoProgrammo numero 203(Maggio/Giugno 2016), trovate un mio articolo dedicato a Roslyn ed in particolare alle Scripting API, con un esempio per  creare un piccolo esempio di REPL (Read Eval Print Loop)

Titolo di copertina:

  • SISTEMA
  • Metti un compilatore nella tua app
  • Scopriamo l'incredibile potenza delle Scripting API di .NET

 

 

 

Programmare con C# 6: in arrivo

Finita la seconda rilettura delle bozze, iniziatala la fase di impaginazione e di impostazione grafica, non manca molto all'uscita in libreria di

Programmare con C# 6, guida completa

Non ho ancora una data di uscita certa, o altri dettagli, come il numero di pagine definitivo, o se qualche capitolo verrà escluso (e magari rilasciato su questo sito in pdf!).

Il libro copretutte le novità introdotte da C# 6, in modo completo ed in modo da rendere il testo il riferimento principale in lingua italiana sul linguaggio C#: l'obiettivo, come per la prima edizione, è stato quello di scrivere il miglior libro italiano su C# 6 (scusate la presuzione!).

Nell'attesa di aggiornarvi con maggiori dettagli di seguito l'elenco degli argomenti che è quasi definitivo.

  • 1. C# e la piattaforma .NET
  • 2. Concetti di base di C#
  • 3 Tipi e oggetti
  • 4 Espressioni e operatori
  • 5 Controllo di flusso
  • 6 Programmazione a oggetti in C#
  • 7 Ereditarietà e polimorfismo
  • 8 Gestione delle eccezioni
  • 9 Tipi generici e collezioni
  • 10 Delegate ed eventi
  • 11 LINQ
  • 12 Multithreading, Programmazione asincrona e parallela
  • 13 XML in C#
  • 14 Reflection, attributi e programmazione dinamica
  • 15 Accesso ai dati
  • 16 .NET Compiler Platform
  • 17 Applicazioni pratiche di C#
  • App. A Stringhe ed espressioni regolari
  • App. B Interoperabilità
  • App. C Risposte alle domande

Noterete la presenza di un nuovo capitolo, il 16, dedicato interamente ad una delle principali nuove funzionalità o caratteristiche di .NET e C# 6: cioè la .NET Compiler Platform, ed inoltre una appendice con le risposte alle domande poste alla fine di ogni capitolo.

 

Inglobare tutte le dll in un singolo exe e utilizzarle con la Reflection

La stragrande maggioranza delle applicazioni usa delle dll esterne, eventualmente di terze parti.

Quando l'applicazione deve essere distribuita anche gli assembly da cui dipende, cioè tutti i riferimenti esterni devono essere distribuiti assieme all'eseguibile. In generale lo si fa con la classica tecnica Xcopy, prendendo tutto quello che c'è nella cartella Bin/Release prodotta da Visual Studio per esempio, oppure creando un setup ad hoc che si occupi di tutto.

Un'altra possibile tecnica è quella di inglobare tutte le dll all'interno dell'eseguibile e quindi con la comodità di distribuire un solo file.

Supponiamo di avere una semplice applicazione Windows Forms, che utilizza una dll per esempio chiamata MyAssembly.dll.

Al progetto Windows Forms, che avrà un riferimento alla libreria, bisogna apportare una prima modifica, aggiungendo il file MyAssembly.dll come un normale file (click con il destro, Add Existing Item e selezione della dll) e quindi, fra le proprietà del file aggiunto, impostando il valore della proprietà Build Action a Embedded Resource.

A questo punto compilando l'applicazione, l'eseguibile prodotto conterrà la dll come risorsa inglobata. Potete verificarlo con un decompilatore come Reflector o JustDecompile.

 

 

Adesso bisogna fare in modo che a runtime l'applicazione sia in grado di recuperare la dll dalle risorse embedded.

Nel metodo Main dell'applicazione aggiungiamo un gestore dell'evento AssemblyResolve dell'AppDomain corrente:

 static void Main()
 {
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
...

 

Il gestore dell'evento, si occupa di ricercare fra le risorse embedded l'assembly (l'evento si scatena al primo utilizzo dell'assembly riferito) e di restituirlo leggendone il contenuto e caricandolo con il metodo Assembly.Load:

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string dllName = new AssemblyName(args.Name).Name + ".dll";

            var asm = Assembly.GetExecutingAssembly();
            String resourceName = asm.GetManifestResourceNames().FirstOrDefault(rn => rn.EndsWith(dllName));
            if (resourceName == null) return null; // Non trovata

            using (var stream = asm.GetManifestResourceStream(resourceName))
            {
                Byte[] assemblyData = new Byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }

 

 


 

Articolo IoProgrammo: Roslyn, il nuovo compilatore di Microsoft

Su IoProgrammo numero 197 (Maggio /Giugno 2015), trovate un mio articolo dedicato alle novità del nuovo compilatore di Microsoft, denominato Roslyn, utilizzato da Visual Studio 2015, che è open source ed è integrabile nelle vostre applicazioni.

Titolo di copertina:

  • Roslyn: Microsoft abbraccia l'Open Source
    Scopri cosa cambia con il nuovo compilatore di Visual Studio 2015

 

 

 



Alla scoperta di C# 6: l'operatore null conditional

L'operatore Null Conditional

 

L'operatore null-conditional, chiamato anche di null-propagation, che sarà introdotto da C# 6, consente di gestire varie situazioni in cui si rende necessario controllare il fatto che un oggetto sia null, ed evitare di incorrere nelle comuni NullReferenceException, riducendo la quantità di codice ripetitivo da scrivere.
L'operatore ? permette di accedere a membri ed indicizzatori di un oggetto solamente quando l'oggetto stesso non è null, restituendo in caso contrario il valore null. Supponiamo ad esempio di avere una classe Persona così fatta:

 

class Persona
{
     public string Nome{get;set;}
     public Indirizzo IndirizzoPersona{get;set;}
}


Supponiamo di voler ricavare il Nome da un'istanza p della classe e memorizzarlo in una variabile. La prima cosa di cui essere sicuri è che l'istanza stessa sia diversa da null:

string nome=null;
if(p!=null)
    nome=p.Nome;


Il primo utilizzo dell'operatore null conditional, permette di evitare l'if/else:

string nome=p?.Nome;


In tal modo, se p è null, la variabile nome assumerebbe valore null, altrimenti il valore della proprietà Nome.
L'operatore è utilizzabile in maniera molto proficua in congiunziona con l'operatore ?? di null coalescing.
Se volessimo infatti assegnare un valore diverso da null alla variabile nome, potremo scrivere:

string nome=p?.Nome ?? "senza nome"; //se p è null restituisce "senza nome"


Così, se p è null, l'operatore null conditional restituirà valore null, e quindio l'operatore ?? a sua volta restituirà il secondo operando "senzanome".
L'operatore null-conditional è utilizzabile anche con membri indicizzatori, per esempio, supponiamo di voler ricavare il primo carattere del nome dell'istanza p.
Se p è null, l'operatore restituisce null, in caso contrario potrà accedere all'indice zero:

char? primo=p?[0];


Altre caratteristiche dell'operatore Null conditional sono mostrate nella versione completa dell'articolo, pubblicata sul Wiki di MSDN Technet

http://social.technet.microsoft.com/wiki/contents/articles/28821.l-operatore-null-conditional-di-c-6-it-it.aspx

Guest Post su MSDN Italia: Caller Info Attributes in C# 5

Vi segnalo il mio guest post sui blog di MSDN Italia, dedicato ai Caller Info Attributes di C# 5.0,

dal titolo

Ottenere informazioni sul chiamante di un metodo in C# 5

Il link è il seguente: http://blogs.msdn.com/b/italy/archive/2014/11/27/guest-post-ottenere-informazioni-sul-chiamante-di-un-metodo-in-c-5.aspx


Anteprima C# 6, le slide

Vi segnalo che ho pubblicato su slideshare le slide relative alla sessione dedicata alle  Novità di C# 6, tenuta la Microsoft Mobile Camp di Catania, il 13 novembre 2014.

Clicca il seguente link


#6 - ITA | L'operatore ternario di C#

L’unico operatore ternario di C# è l’operatore ? : (detto anche operatore condizionale).
Esso permette di restituire una fra due espressioni, a seconda che una condizione risulti vera o falsa.
Quindi anzichè usare un costrutto if/else del tipo:

string result;
if(cond)
result=op1;
else result = op2;



con l'operatore ternario basta scrivere in una sola riga:

result = cond ? op1 : op2; 



se la condizione cond è true, l'operatore restituisce l'operando op1, altrimenti restituisce op2.

 

questo e altro all'interno di Programmare con C# 5, guida completa