C#
L'Entity Framework e Linq To Sql avranno i suoi (grossi) limiti, ma vedere che da: IEnumerable<CategoryView> views = from d in categories select new CategoryView() { Id = d.Id, Name = d.Name, ImageUrl = d.ImageUrl, ImageIconUrl = d.ImageIconUrl }; con un semplice CNTRL-R-R il risultato è questo: IEnumerable<CategoryView> views = from e in categories select new CategoryView() { Id...
Il solito Scott segnala un post che contiene la lista aggiornata al 28 febbraio, dei providers Linq ufficiali e non. Lo stesso Charlie pubblicherà qui i futuri aggiornamenti. Technorati Tag: Linq,Providers
il compilatore restituisse un errore nel caso in cui non gli piaccia l'ordine dei namespace dichiarati a inizio file. Oppure se... il compilatore restituisse un errore nel caso in cui non gli piaccia l'ordine delle classi/delegati/enumerazioni all'interno di un file. O ancora peggio se... il compilatore restituisse un errore nel caso in cui non gli piaccia l'ordine dei file da compilare. Ma anche se... con tanta fatica (e fortuna) riusciamo a trovare la giusta combinazione, ma un piccolo flag - fondamentale per la buona riuscita della compilazione - all'interno della configurazione del nostro progetto,...
Roy Osherove fornisce in questo post, alcuni validi motivi del perchè secondo lui non dovrebbe essere possibile permettere di fallire più assert nell'esecuzione di un singolo unit test. Il post è in contrapposizione con un'altro post di James Avery dove viene spiegato invece, il perchè questa feature potrebbe essere utile.
Un piccolo assaggio che quoto in pieno:
"Even if we assume that all the asserts are run, you're essentially running multiple tests on code that has "dirty" state. For example, asserting on the result of a method call may actually change the state of the object under test so that the next call to that method may...
Ogni tanto, leggendo l'msdn, escono cose simpatiche:)
Tratto dalla documentazione del metodo CppCodeProvider.CreateCompiler su MSDN Library:
"
.NET Framework Class Library
CppCodeProvider.CreateCompiler Method
Note: This method is new in the .NET Framework version 2.0.
NOTE: This method is now obsolete. Creates an instance of the C++ code compiler.
Namespace: Microsoft.VisualCAssembly: CppCodeProvider (in cppcodeprovider.dll)
"
Non bastasse, l'implementazione del metodo restituisce un NotImplementedException....Technorati tags: Msdn, Codedom
In c++, quando utilizziamo un template (prendiamo ad esempio il tipo std::vector), è pratica abbastanza diffusa definire un nuovo tipo del template specializzato.
Qualcosa di questo tipo per intenderci:
typedef std::vector IntVector;
Come sappiamo usare un template (o un tipo generico del framework) allunga incredibilmente il nome del tipo e risulta molto scomodo dover ripetere lo stesso nome per intero ad ogni cast, istanziazione etc etc. Esiste qualcosa di simile al tipedef anche in C#? La risposta è si, ma tenendo ben presente l'aggettivo SIMILE. In C# possiamo definire un alias utilizzando la key using. La "dichiarazione duale del tipo IntVector di c++, in c# sarebbe:
using IntList = System.Collection.Generic.List;
Leggere...
Problema: dobbiamo scrivere una serie di unit test che testano le funzionalità di un singleton pubblicato con Remoting.
Perchè è un problema? Perchè se specifico la porta usata dall'HttpChannel ed eseguo due test consecuitivi che registrano il nostro oggetto mediante l'httpchannel, il secondo test fallirà sempre. Il problema è dovuto al fatto che il socket del canale viene chiuso in maniera non determinstica (quando ne ha voglia il GC), quindi, quando viene eseguita (indirettamente dall'httpchannel) la bind per la seconda volta, viene lanciata un'eccezione che ci avverte che la porta tcp è già in uso ("only one usage of each socket address (protocol/IP address/port)...
Visto che ne ho avuto bisogno, pubblico un piccolo snippet per risolvere il problema:private static string ConvertToHex(string msg) { if (msg == null || msg == string.Empty) { return string.Empty; } System.Text.StringBuilder sb = new StringBuilder(); byte[] bmsgs = ASCIIEncoding.ASCII.GetBytes(msg); foreach (byte inByte in bmsgs) { sb.Append(String.Format("{0:X2} ",inByte).Trim()); } return sb.ToString(); }
Riprendo il post di Lorenzo riguardo l'AOP e Net fornendo uno stralcio dell'intervista a Don Box (per la quanle nn finirò mai di ringraziare il nostro caro presidente :) che esprime il suo parere proprio sull'AOP e sulle tecniche di interception.
Personally, I think there are a lot of interesting programming paradigms out there, and I think that the industry has beaten the "attributes+interception" style of AOP to death. Personally, I've been much more inspired by the ideas that sprang from functional programming and think that Whidbey brings several of those ideas to the masses. Specifically, C#'s anonymous methods (closures) and iterators are...
Il codedom si sa è una delle parti più interessanti del framework. Visto che c'è, perchè non usarlo? DavsGen è la prima versione versione di una serie di wizard integrati nel visual studio. Quando si aggiunge una classe ad un progetto di vs (sia esso in csharp che in vb) potrebbe essere utile avere una GUI per dichiarare i membri della classe e associargli automaticamente le propietà senza doversele scrivere ogni volta a mano.
Il wizard è liberamente scaricabile dal sito. DavsGen è distribuito sotto forma di file di installazione per semplificare il deploy del wizard. Ovviamente ogni feedback, idea o...
... e voglia portarsi via tutte le nostre vecchie e robuste applicazioni unmanaged, una frase (e un articolo) che chiarifica alcuni preconcetti:
"Some have speculated that C# is a replacement for C++, but it most certainly is not. C# is a language that is easier to learn than C++, and provides access to the functionality of the CLR. For those who already know C++, there's no need to learn anything to gain access to the functionality of the CLR, and C++ has features that are not in C#, so moving would actually involve giving up some power."
La frase è presa dall'articolo...
Prendiamo questo Snippet di codice:
using System; using System.Runtime.Remoting; using System.Reflection; using System.Threading; namespace AppDomTest { public class InvokeMethod { public static void Main( String[] argv ) { AppDomainSetup info = new AppDomainSetup(); AppDomain dom = AppDomain.CreateDomain("RemoteDomain", null, info); Foo f = dom.CreateInstance("AppDomTest", "AppDomTest.Foo").Unwrap() as Foo; Foo f2 = new Foo(); Foo f3 = new Foo(); f3.PrintCounter(); AppDomain.Unload(dom); Console.Read(); } } public class Foo : MarshalByRefObject { private static int _ci = 0; public Foo() { _ci++; } public void...
Spesso, programmando in c++, mi scontro con diversità nell'interpretazione (ed effettiva implementazione) della programmazione a oggetti rispetto al c#. Quando mi trovo in queste situazioni mi viene da pensare il motivo di questa differenza e perchè in fase di progettazione dei due linguaggi Straustrup e Hejlsberg sono arrivati a due conclusioni differenti. L'esempio più eclatante riguarda sicuramente la diatriba sull'ereditarietà multipla. In questo post invece mi volevo soffermare su un problema molto meno rilevante dell'esempio appena citato: l'initializer nei costruttori e in particolare richiamare nell'initializer un'altra versione del costruttore della classe.
In entrambi i linguaggi l'initializer è opzionale e in c# accetta solo costruttori,...
Oggi mi sono imbattuto in una possibile anomalia delle enumerazioni. Consideriamo una enum dichiarata così:
public enum MyEnum { Val0 = 0, Val10 = 10, Val2, Val3 = 7, Val11 = 11} Un possible frammento di codice che usa l'enum può essere il seguente:.....MyEnum p = MyEnum .Val11;int i = (int) p;Console.WriteLine("MyEnum : {0}, i: {1}", p, i);p = MyEnum .Val2; i = (int)p; Console.WriteLine("MyEnum : {0}, i: {1}", p, i); Cosa viene visualizzato a video? E' naturale aspettarsi di trovare le seguenti righe: "MyEnum : Val11, i: 11""MyEnum : Val2, i: 2"Invece inaspettatamente a video sarà stampato:"MyEnum : Val11, i: 11""MyEnum...
Evidentemente non sono l'unico a essermi fatto questa domanda....
Dando un'occhiata al codice di Mono, nell'implementazione della proprietà LocalEndPoint e RemoteEndPoint si può notare il seguente codice (e i commenti) :
"...
if(sa.Family==AddressFamily.InterNetwork || sa.Family==AddressFamily.InterNetworkV6 ) {
// Stupidly, EndPoint.Create() is an
// instance method
return new IPEndPoint(0, 0).Create(sa);
}
..."
Chissà se chi ha progettato (o implementato) la classe IPEndPoint lavora ancora in Microsoft:P
La motivazione viene data direttamente da Eric Gunnerson in questo post. Sono interessanti anche i commenti....
Mi inserisco nella simpaticissima saga di Adrian dando il mio piccolo contributo....:)
using System; static void Main(string[] args) { Foo.Test(); Console.Read(); }public static void Test() { try { Console.WriteLine("Step Try"); return; } finally { Console.WriteLine("Step Finally"); } Console.WriteLine("Step Exit"); return; }
Cosa viene visualizzato a console?
A)
Step Try
B)
Step Try
Step Finally
C)
Step Try
Step Finally
Step Exit
Gianluca
Segnalo qualche post del blog di Brad Abrams in cui vengono elencate alcune (OTTIME) regole da tenere presente nella costruzione delle classi. Da stampare e attaccare sopra il monitor:)
On Designing Good Libraries -- Part I
On Designing Good Libraries -- Part II
On Designing Good Libraries -- Part III
On Designing Good Libraries -- Part IV
E se non vi bastasse.... c'è sempre questa serie di articoli sull'MSDN...
Buon Refactoring....:)
Volevo fare i complimenti ad Adrian per il bellissimo articolo sulla ricerca del pattern Singleton. Oltre ad essere molto interessante lo trovo scritto veramente bene. Complimenti Adrian! A quanto il prossimo numero?:)
La risposta è non si può. O almeno questa è la risposta che mi è stata data da tutti gli sviluppatori a cui ho rivolto questa domanda... La soluzione?
L'unica soluzione che mi è venuta in mente è stata farselo... Armato solo di QueryDOM e Visual Studio mi sono messo sotto un paio di settimane e il risultato prodotto si chiama QueryBuilder... Sicuramente seguiranno altre versioni (mancano ancora da implementare un po' di feature) ma il risultato mi sembrava carino è voluto proporvelo. Come al solito sono ben accette critiche e feedback:)
Ora anche mono ha il suo IDE!!! Si chiama MonoDevelop ed è il portinig di SharpDevelop per GTK#... c'è ancora molto lavoro da fare ma come si dice, è sempre meglio di....:)
Dopo molto lavoro e dopo un ultimo refactoring lampo, è con piacere che sottopongo al critico giudizio del pubblico QueryDOM. Query Document Object Model (QueryDOM) è una libreria open source che espone un modello ad oggetti per manipolare query sql. Tra le altre cose la libreria espone una serie di interfaccie per aggangiare tools di parsing al QueryDOM. Attualmente è stato sviluppato un wrapper per il parser GParser.
Home Page: http://qdom.sourceforge.net
Project Page: http://sourceforge.net/projects/qdom
In questi giorni si parla molto delle nuove specifiche che saranno introdotte nella prossima release del c#. Volevo segnalare questo blog che mette in risalto alcune conseguenze delle specifiche che a prima vista possono sfuggire...
Questo è il link...
http://weblogs.asp.net/fbouma/posts/33462.aspx
Vorrei svezzare il mio Blog (colgo l'occasione per ringraziare UGI per averci messo a disposizione questo strumento!!) segnalandovi ANTLR. ANTLR è l'acronimo di ANother Tool for Language Recognition e altro non è che un tools che permette di parsare stringhe formattate secondo una specifica grammatica. La versione 2.7.2 (l'ultima per ora rilasciata) è particolarmente interessante perchè offre la possibilità di generare, partendo da una grammatica, codice in linguaggio c# oltre a Java e c++ già presenti nelle precedenti versioni. Segnalo anche che sul sito sono presenti diverse grammatiche già pronte per l'uso come ad esempio quella sql e html.
Sperando...