maggio 2005 Blog Posts
Con grande fretta e grande gioia segnalo il fatto che alla base di queste due API sta la stessa idea, un object model per le query:
QueryDOM di Gianluca Carucci (vedi il namespace DevArchitect.Data.QueryDOM)
SQL Server 2005 (CTP) Notification Services Rules di Microsoft (vedi il namespace Microsoft.SqlServer.NotificationServices.Rules)
Grande Gianluca! :-)
Se il seguente snippet:
delegate void FooFiredEvent(); class Foo{ public event FooFiredEvent FooFired; public void RaiseFooFired() { if (FooFired != null) { FooFired(); } }}
lo compiliamo:
csc foo.cs
poi lo disassembliamo :
ildasm foo.exe /out=bar.il
e nel file disassemblato, bar.il, inseriamo la riga in rosso:
.event FooFiredEvent FooFired{ .addon instance void Foo::add_FooFired(class FooFiredEvent) .removeon instance void Foo::remove_FooFired(class FooFiredEvent) .fire instance void Foo::RaiseFooFired()}
dopodiché lo riassembliamo:
ilasm /exe bar.il
e apriamo il file bar.exe col Reflector impostato per C#, avremo una sorpresa: nel codice disassemblato dell'evento FooFired, è apparsa una sezione, raise, che non c'è ancora nel linguaggio C# :-)
public event FooFiredEvent FooFired{ [MethodImpl(MethodImplOptions.Synchronized)] add { this.FooFired...
Un davvero splendido corso di "Managed Computation" tenuto nella primavera dell'anno scorso al Politecnico federale di Zurigo da Prof. Robert Stärk per gli studenti iscritti al programma di MSc in Computer Science, è scaricabile da questa pagina.
Nelle più di 500 slide del corso, le specifiche di C# vengono modellate come macchine astratte (ASM). Una gioia leggerlo, abbiate solo pazienza!
Si sa che i metodi corrispondenti agli event accessor devono seguire un pattern di denominazione (vedi CLS Rule 33 e ECMA-335, Partition I, 10.4). Per esempio, l'accessore add deve seguire il pattern:
void add_<EventName> (<DelegateType> handler)
Luca, in questo interessante post, è arrivato ad aver bisogno di richiamare questi event accessor. Provando col compilatore C#, si ottiene l'errore CS0571 ("cannot explicitly call operator or accessor"). Vediamo se, per il seguente snippet, il compilatore C# genera per i metodi add_FooFired e AddFooFired lo stesso codice IL:
class Foo{ private FooFiredEvent mFooFired; public event FooFiredEvent FooFired { add { mFooFired += value; } remove { ...
Non sempre quando vi appare una finestra "Just-In-Time Debugging", nel messaggio "An exception 'MyNamespace.MyException' has occurred in MyApplication.exe", l'eccezione debba essere una exception. Può capitare di incontrare al posto di 'MyNamespace.MyException', 'Launch for user' :-)
Un esempio, in questo snippet:
class Foo{ static void Main() { System.Diagnostics.Debugger.Break(); }}
Secondo me, crea un po' di confusione il messaggio.
Quale tra i seguenti due metodi ricorsivi riuscirà a fare più iterazioni e perché?
void Foo(){ System.Reflection.MethodBase.GetCurrentMethod().Invoke(this, null);}void Bar(){ Bar();}
A. Foo;
B. Bar;
C. per Foo non otteniamo StackOverflowException.
E' semplice: approfito della somiglianza tra la mia lingua madre (il rumeno) e la vostra e creo nuove parole/frasi che non esistono in nessuna delle due lingue ma che mantengano ancora la similitudine. Così me la ricordo facilmente e allo stesso tempo ho la sicurezza che non si trova in nessun dizionario - in più, è anche molto divertente :-)
Perché ve lo dico? Perché così potreste fare anche voi con le vostre meravigliose combinazioni dialetto-italiano. A proposito di dialetti: ascolta qualcuno la sfida in dialetto domenica sera su Radio24?
I seguenti due snippet si compilano con le stesse opzioni, però il codice IL generato per i due foreach, come struttura, è ben diverso:
using System;using System.Management;class Foo{ static void Main() { foreach (ManagementObject device in new ManagementClass("Win32_LogicalDisk").GetInstances()) { Console.WriteLine(device["deviceid"]); } }}
using System;using System.Xml;using System.Xml.Schema;class Foo{ static void Main() { string xsd = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\Microsoft Visual Studio .NET 2003\\Common7\\Packages\\schemas\\xml\\asp.xsd"; XmlTextReader reader = new XmlTextReader(xsd); foreach(XmlSchemaObject schemaObj in XmlSchema.Read(reader, null).Items) { Console.WriteLine(schemaObj.LineNumber); } reader.Close(); }}
Offrite una spiegazione.