Ugialt.net

Prendo a prestito delle parole di Antonio Carpentieri per descrivere il perchè ho aderito con entusiasmo all’iniziativa ugialt.net:

“…..Ha un mix di agile + object-orientation + patterns + TDD + DDD. Perchè per ognuno dei punti di cui sopra esistono degli strumenti che permettono di applicarli in .net, perchè li USO, perchè spesso ho dei dubbi, delle perplessità ma nonostante queste effettuo delle scelte sia di design, che di processo e VOGLIO informarmi su come altri stanno lavorando, fanno evolvere i pattern di design o del processo perchè cerco il modo migliore di comunicare e motivare delle scelte tecniche che agli occhi di un manager che vede solo “the microsoft way” possono risultare solo le scelte di un geek… ecco, io mi sento a casa in mezzo a persone che hanno questo spirito. Condividere per crescere. Creare senza aspettare.”

Implementazione esplicita di membri di interfaccia

L’implementazione esplicita di una interfaccia presenta caratteristiche significative rispetto ad una implementazione per così dire non esplicita. Ad esempio, si consideri l’interfaccia:

public interface IExplicitImplementation 
{ 
   string Method1(string par); 
}

e la seguente classe che la implementa in modo esplicito:

public class Class1 : IExplicitImplementation  
{
    string IExplicitImplementation.Method1(string par) 
    {
       return “Hello world “ + par;
    }
}

Le caratteristiche salienti sono:

– Il client che consuma la classe Class1 utilizzando una istanza di quest’ultima è impossibilitato a richiamare il metodo Method1 in quanto quest’ultimo NON fa parte dell’interfaccia pubblica della classe (non è visibile con l’intellisense ed il tentativo di richiamare comunque il metodo genera un errore di compilazione).

Questo codice genera un errore di compilazione:

Class1  cl1 = new Class1();
cl1.Method1();

– Il client che consuma la classe Class1 può invocare il metodo Method1 solo attraverso una istanza dell’interfaccia IExplicitImplementation che la classe stessa implementa esplicitamente. Vale a dire:

ExplicitImplementation i = new Class1();
Console.WriteLine( i.Method1(“Maurizio”));

Quindi un metodo che implementa esplicitamente una interfaccia è, per così dire, privato e pubblico nello stesso tempo. E’ privato perchè non compare nell’interfaccia pubblica della classe e non può essere richiamato attraverso una  istanza della classe stessa; è pubblico perchè può comunque essere richiamato utilizzando una istanza dell’interfaccia.

– Un metodo che implementa esplicitamente un membro di una interfaccia non può contenere alcun modificatore di accesso, nè i modificatori static, abstract, override e virtual. L’ultima caratteristica determina anche l’impossibilità di effettuare l’override di una implementazione esplicita di un membro di una interfaccia. Questo ostacolo è comunque raggirabile dichiarando un altro metodo virtuale (e quindi ridefinibile) e richiamando quest’ultimo metodo nel codice che implementa esplicitamente un membro di una interfaccia.

Come terminare un processo corrotto in .NET

Da .NET 2.0 in poi è possibile terminare un processo corrotto irreparabilmente attraverso il medodo Environment.Failfast(string message), il quale provvede a:

  1. Scrivere una entry nell’Application Event Log con il messaggio specificato
  2. NON eseguire alcun blocco try-finally ancora in sospeso
  3. NON esegue alcun finalizer sugli oggetti ancora in memoria
  4. Esegue un dump dell’applicazione
  5. Termina il processo

I punti 2-3 sono necessari in un contesto simile in quanto la loro esecuzione potrebbe danneggiare risorse usate dall’applicazione stessa. Tuttavia gli oggetti CriticalFinalizerObject (di cui magari parlerò in un post a parte) sono comunque eseguiti prima di terminare il processo.

Inconsistenza operatori di confronto dei Nullable Types in C#

Il linguaggio C# offre un supporto decisamente migliore dei Nullable Types rispetto a VB .NET. Nonostante ciò, utilizzando gli operatori di confronto su un tipo Nullable, es. un intero, il risultato è a dir poco strano e può dar luogo a bug piuttosto subdoli.
Infatti, eseguendo il seguente codice:

int? a;
int? b;
a=null;
b=null;
Debug.WriteLine(a == b);
Debug.WriteLine(a != b);

l’uguaglianza dei due tipi nullable con entrambe le variabili impostate a null dà come risultato “true”, mentre  l’operatore  di disuguaglianza  sulle stesse variabili produce come risultato “false”. Sin qui il comportamento è coerente.

Questo codice invece:

produce in entrambi i casi un risultato pari a "false", risultato a prima vista strano, oserei quasi dire illogico.

In sostanza:

  • "a" è uguale a "b", ma "a" non è maggiore "oppure" uguale a "b".
  • "a" è uguale a "b", ma "a" non è minore "oppure" uguale a "b"

I commenti sono aperti.

Troubleshooting remote assistance

Per una volta parlo di come risolvere un piccolo ma noioso problema sistemistico: provando ad utilizzare l’assistenza remota di MSN mi appariva questo strano errore:

“Impossibile aprire la Guida in linea e supporto tecnico perchè un servizio di sistema non è in esecuzione. Per risolvere il problema, avviare il servizio denominato ‘Help Service”

Il servizio in questione, chiamato “Guida in linea e supporto tecnico” nella versione italiana, è chiaramente la Guida in linea di Windows XP, che evidentemente non era presente sulla macchina. Ma l’aspetto più imbarazzante era che non  vi era nessun  servizio chiamato in quel modo tra l’elenco dei servizi di Windows.  Quindi, come  (re)installare la Guida  in linea ?  In questi casi, come al solito, non esiste aiuto migliore dei gruppi di discussione sull’argomento specifico.

Ecco come procedere:

  • Browse della directory c:\windows\inf e cercare il file pchealth.inf. Click destro e scegliere installa.
  • Al temine, installare il servizio attraverso questo comando: Start /w helpsvc /svchost netsvcs /regserver /install 
  • Al termine dell’installazione riavviare Windows XP,  ed ecco che magicamente comparirà il servizio in questione tra i servizi di Windows

Con il servizio avviato, l’assistenza remota di Windows non dà più problemi.

Ora mi chiedo: cosa c’entra la guida in linea di Windows con l’assistenza remota. ?

P.S: Un grazie a Rossano Orlandini, MVP Windows Server, per la soluzione al problema.