C#

ASP.NET Identity 2.1

Non nego che sia una bella novità del mondo .net ma la mancanza di informazioni al riguardo è molto alta. Ho impiegato 3 giorni per riuscire ad utilizzarla tra l'altro in un modo molto base. Con il progetto web di default si include già troppo codice che poi va commentato o scommentato. Tutti i messaggi di errore sono hard coded e non sono localizzati... Ho dovuto scaricare da nuget i samples per capire cosa non andava nel mio progetto. Gli stessi samples non funzionano se portati all'interno di un proprio progetto: usermanager e rolemanager nell'initializer vanno recuperati direttamente dallo store invece...

Disposable Email Addresses (DEA)

Quando mi devo iscrivere a qualche sito e devo inserire il mio indirizzo email, sono spesso preoccupato che il mio indirizzo venga utilizzato per spam. Questo succede anche quando non si mette la spunta su "Voglio ricevere informazioni commerciali". La soluzione è abbastanza immediata: creare un indirizzo email ad hoc per effettuare questo tipo di registrazioni. Da qualche anno però esistono vari servizi gratuiti che consentono di creare un indirizzo email per un breve periodo di tempo: magari giusto qualche minuto per ricevere la mail che contiene la password di registrazione o il link per confermare l'iscrizione. Funzionano tutti egregiamente. I gestori dei...

string.format e separatore date

Oggi ho scoperto che lo string.format utilizzato con le date come ad esempio: string.Format("0:dd/MM/yyyy", myDateTime); è dipendente dalla culture corrente, in particolare il separatore è dipendente da tale impostazione. Quindi in culture tedesca la data verrà stampata nel formato dd.MM.yyyy dato che il separatore è il punto. Per ottenere come separatore lo slash occorre usare: string.Format("0:dd'/'MM'/'yyyy", myDateTime); Technorati tags: c#

Orchard

Dopo alcuni test, posso dire che Orchard è un prodotto ancora troppo giovane. La flessibilità data al prodotto causa poca usabilità sia per lo sviluppatore che per l'utente finale. Parlo solo di interfacce perchè non sono andato a modificare il codice sorgente. Un solo libro valido sull'argomento e serve solamente per orientarsi dato l'esiguo numero di pagine (capisco anche che con un prodotto in evoluzione sia inutile scrivere di più). Il numero di moduli che presentano problemi è molto alto, senza contare che all'uscita di una nuova versione bisogna sempre verificare tutto. C'è bisogno di trovare maggior equilibrio.   Technorati tags: Orchard

Alternativa a Visual Studio

Un piacevole ambiente di sviluppo (che probabilmente esiste da una vita) ma che non conoscevo: http://sharpdevelop.net/OpenSource/SD/Download/   Technorati tags: Visual Studio

.Substring()

Non sto a spiegare cosa fa perchè tutti l'avranno usato molte volte. Il primo parametro indica l'indice 0-based da cui partire. Il comportamento che non mi aspettavo è che l'indice può arrivare alla Length della stringa senza sollevare eccezioni. [C#] String myString = "abc"; bool test1 = String.Compare(myString.Substring(2, 1), "c") == 0; // This is true. myString.Substring(3, 1); // This throws ArgumentOutOfRangeException. bool test2 = String.Compare(myString.Substring(3, 0), String.Empty) == 0; // This is true. Technorati tags: Csharp

C# o VB.NET?

La domanda si ripete ovunque: ma in una realtà aziendale (di q.si dimensione) è giusto o no decidere un linguaggio comune per tutti? Secondo me è giusto definire un linguaggio di sviluppo e obbligare le risorse a utilizzarlo. Inutile dire che, tra i due, scelgo C#. Le uniche eccezioni possono essere rappresentate da: 1.  un team già avviato al vb.net 2.  la presa in carico di un'applicazione esistente. Nelle nuove realtà io opterei già dai colloqui per la selezione di risorse che sviluppano in C#. Per passare dall'uno all'altro basta poco - è vero - ma a volte i tempi sono davvero rigidi e alcune...

Quiz: extension methods

Quale sarà l'output? namespace Extensions{  using System;  using ExtensionMethodsDemo1;     // Define extension methods for any type that implements IMyInterface.     public static class Extension     {        public static void MethodA(this IMyInterface myInterface, int i)        {            Console.WriteLine("Extension.MethodA(this IMyInterface myInterface, int i)");        }        public static void MethodA(this IMyInterface myInterface, string s)         {            Console.WriteLine("Extension.MethodA(this IMyInterface myInterface, string s)");        }        public static void MethodB(this IMyInterface myInterface)         {            Console.WriteLine("Extension.MethodB(this IMyInterface myInterface)");        }    }}namespace ExtensionMethodsDemo1{    using System;    using Extensions;    public interface IMyInterface    {        void MethodB();    }    class A : IMyInterface     {        public void MethodB(){Console.WriteLine("A.MethodB()");}    }     class B : IMyInterface    {        public void MethodB() { Console.WriteLine("B.MethodB()");...

Extension methods

Gli extension methods permettono a metodi statici di essere richiamati usando la sintassi dei metodi di istanza. Questi metodi devono avere almeno un parametro che rappresenta l'istanza del metodo su cui operare. In C# su questo parametro si utilizza la parola chiave this. public static class StringExtensions{     public static bool IsPalindrome(this string s){        ...     } } Questo metodo viene richiamato nel seguente modo: if("hello world".IsPalindrome()){   .... } La classe che definisce l'extension method viene definita "sponsor" e deve essere statica. Ovviamente va importato il namespace della classe sponsor. Vanno usati il minimo indispensabile ;) [Fonte: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (2nd Edition) - K. Cwalina, B....

Pseudoquiz - Tanti modi per fare una cosa

Stimolerei il vostro "modo di programmare". Immaginate di avere una combo su una pagina web [c#]. Vi chiedo di riempirla con i giorni della settimana sapendo che nell'applicazione ci sono molte combo di quel tipo. La pagina web deriva da una BasePage : System.Web.UI.Page e ha un metodo già pronto richiamato dalla OnLoad che si chiama PrepareCombo(). Sentiamo varie soluzioni (ovviamente ottimizzate tempi di sviluppo con buon codice). Nei commenti sono ben accette le critiche alle soluzioni proposte. Technorati tags: Csharp

Rinnovo patente

Vediamo di mettere in codice anche questo evento della vita quotidiana che mi è capitato proprio oggi. Come prima idea mi verrebbe da scrivere una classe Patente non statica, istanziarla: Patente myPatente = new Patente(); poi per il rinnovo: myPatente.Rinnova(); dove il metodo non fa altro che aggiornare una proprietà pubblica Anni o privata _anni: public void Rinnova() {      _anni += 10; } Questo è sbagliato per vari motivi: 1. La proprietà privata ha un nome troppo generico (cosa indicano questi anni?); 2. La nomenclatura più appropriata sarebbe Durata e non Anni; 3. Bisognerebbe aggiornarla ogni anno e per il momento non ci interessa. Ci interessa conoscere la validità non per quanti anni...

General naming conventions

Sarebbe bello che tutti le seguissero (per ora enuncio solo quelle basilari): 1. Scegliere nomi LEGGIBILI per gli identificatori 2. Favorire la LEGGIBILITA' e non la BREVITA' (!) 3. Usare solo caratteri alfanumerici (niente underscore) 4. Non usare la notazione ungherese (ammessa la I per le interfacce) Technorati tags: Csharp

ClassLibrary

Con tutto il rispetto per tutti i programmatori, sottolineando che conosco le condizioni di produzione e che faccio parte di questa categoria, mi permetto di scrivere questo racconto per un piccolo sorriso.  Buonasera, siete seduti comodi? Bene! Siete davanti al Visual Studio e state per premere new ClassLibrary? Siete proprio sicuri? E va bene, allora fatelo. Quanto tempo avete a disposizione? Poco? Allora iniziate col chiamare il vostro lavoro "Insieme di classi" e non "Libreria". Se invece ne avete un po' di più allora ve lo permetto . Ma questo insieme di classi serve a voi per seguire un certo pattern o serve per distribuirlo...

Focus in UpdatePanel

<asp:TextBox ID="txtValore" runat="server" onfocus='setTextBoxFocused(this.id);SetEndCursor(this)'   AutoPostBack="true" OnTextChanged="txtValore_TextChanged"></asp:TextBox>   function setTextBoxFocused(clientId) { $.get("SetFocused.aspx?clientId=" + clientId + "&ts=" + new Date().getTime()); }     function SetEndCursor(textBox) { if (textBox.createTextRange) { var fieldRange = textBox.createTextRange(); fieldRange.moveStart('character', textBox.value.length); fieldRange.select(); } }   CodeBehind nel controllo con UpdatePanel: if (Session["TextBoxFocused"] != null) { ScriptManager.GetCurrent(this.Page).SetFocus(Convert.ToString(Session["TextBoxFocused"])); } La pagina richiamata da JSON: SetFocused.aspx protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (Page.IsPostBack) return; Session["TextBoxFocused"] = Request.QueryString["clientId"]; } Grazie a Gae. Technorati tags: .NET,  Csharp

La rappresentazione dei double...

Oggi mi è capitato questo problema con i double. Dopo le operazioni che vedete di seguito, effettuavo un arrotondamento che mi ha permesso di evidenziare il problema. Il double d è stato aggiunto come esempio corretto, prima avevo solo il double risultato. Il problema è causato dalla memorizzazione binaria dei double come numeri a virgola mobile. Questo può causare non pochi problemi visto che il tipo double è utilizzato spesso per rappresentare i prezzi. double risultato = 1.0675; risultato = risultato * 100; double d = Double.Parse(risultato.ToString()); Console.WriteLine(risultato); Console.WriteLine(d); Console.ReadLine(); Un'altra soluzione del problema è usare i decimal. Technorati tags: Csharp

Un errorino subdolo

Occhio alla differenza tra: for (int i = 0; i < 2; i++) { string s = "errore: " + i + 1 + " mancante!"; } e questo: for (int i = 0; i < 2; i++) { string s = "errore: " + (i + 1) + " mancante!"; }Technorati tags: .NET, Csharp

Il problema di Math.Round()

Problema: Anche se non si può parlare proprio di bug, vorrei risolvere il problema di Math.Round(), davanti al quale mi sono trovato diverse volte: Console.WriteLine(Math.Round(1.5)); Console.WriteLine(Math.Round(2.5)); Console.ReadLine(); Restituisce 2 in entrambi i casi. E non va assolutamente bene nelle nostre applicazioni dove in generale vogliamo arrotondare alla cifra precedente il numero che termina con 0-4 e alla cifra successiva il numero che termina con 5-9. Soluzione: Diverse le soluzioni in rete, tutte matematiche. Correggo ciò che avevo scritto precedentemente, grazie al suggerimento di Stefano, per segnalare la presenza di un overload: Console.WriteLine(Math.Round(1.5, MidpointRounding.AwayFromZero)); Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero)); Console.ReadLine(); che restituisce il risultato corretto Technorati tags: Csharp

Repeater innestati

Per gestire due repeater innestati: <asp:Repeater runat="server" ID="groupItemRepeater" OnItemDataBound="groupItemRepeater_ItemDataBound"> <ItemTemplate> <!-- bla bla --> <asp:Repeater runat="server" ID="singleItemRepeater"> <ItemTemplate> <!-- bla bla --> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> E nel code behind: protected void Page_Load(object sender, EventArgs e) { groupItemRepeater.DataSource = //loading; groupItemRepeater.DataBind(); } protected void groupItemRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { RepeaterItem item = e.Item; if ((item.ItemType == ListItemType.Item) || (item.ItemType == ListItemType.AlternatingItem)) { ...

Proviamoci tutti: ottimizzazione e minimizzazione di codice

Proviamo a ottimizzare e minimizzare questo codice scritto senza pensare troppo (presente in uno user control - noterete i this): in un sito voglio mostrare quattro immagini random diverse prese da una galleria rappresentata da una collection di images. Ammesse funzioni del tipo Array.xxx. Obiettivo primario eliminare i--   IList<MyClass> images = // loading; if (images != null && images.Count > 0) { // ottimizzazione ...

Using per i Generics

Per rendere il codice più leggibile è possibile usare using per creare degli alias: using InsiemeInteri = Namespace1.Classe<int>; using InsiemeClasseItem = Namespace1.Classe<Namespace2.ClasseItem>; dove Classe è la Classe contenitore e ClasseItem la classe usata all'interno del contenitore, il tipo di Generic per intenderci. Namespace1 e Namespace2 sono i namespace a cui appartengono le due classi di cui ho parlato in precedenza. Technorati tags: .NET,  Csharp

I commenti

// commento PROGRAMMO ergo COMMENTO A quante persone dovremmo insegnare il primo comandamento?   Mi permetto un EDIT: io sono favorevole a commentare anche i metodi privati (molti dicono sia inutile). La motivazione? Chi vi ha detto che un domani il vostro codice non finisca nella mani di qualcun altro? Technorati tags: .NET,  Csharp