Csharp

There are 16 entries for the tag Csharp

.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