Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

domenica 4 marzo 2007

Extension Methods

Tra le numerosissime novità del .NET Framework 3.5 che sto sperimentando in questi giorni, oggi voglio segnalare gli Extension Methods. Come riportato qui:

The basic idea is that the set of methods available on an instance of a particular type is open to extension. In effect, we can add new methods to existing types.

Supponiamo di eseguire sempre la stessa operazione su un certo tipo di dati, ad esempio ottenere l'array di byte a partire dal contenuto di una stringa. Una soluzione tipicamente adottata fino ad oggi consiste nel definire una classe statica con il metodo che esegue l'operazione, quindi richiamarlo utilizzando qualcosa del tipo:

string message = "Messaggio"; byte[] buffer = Utils.GetBytes(message);

In una situazione del genere è possibile definire un Extension Method:

1 public static class Utils 2 { 3 public static byte[] GetBytes(this string str) 4 { 5 return Encoding.Default.GetBytes(str); 6 } 7 }

La parola chiave this (linea 3) indica che il metodo GetBytes è un'estensione della classe String. In pratica, la classe String viene arricchiata con un nuovo membro, che può essere richiamato come qualsiasi altro:

string message = "Messaggio"; byte[] buffer = message.GetBytes(); //Stesso risultato del primo esempio.

Anche l'IntelliSense di Visual Studio visualizzerà il nuovo metodo, segnalando che si tratta di un'estensione della classe. Gli Extension Methods sono supportati sia da C# sia da Visual Basic. Quest'ultimo linguaggio non supporta la parola chiave this, quindi per definire un Extension Method è necessario specificare l'attributo <Extension()> (contenuto nel namespace System.Runtime.CompilerServices.ExtensionAttribute) prima della dichiarazione del metodo. Le estensioni devono essere metodi statici contenuti in classi statiche.

Technorati Tags: , ,

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (5) | Filed Under [ C# VB .NET Orcas & .NET 3.5 ]

Paint.NET 3.01

Qualche giorno fa è stata rilasciata la release 3.01 di Paint.NET. Si tratta di un aggiornamento che si limita a risolvere alcuni bug della versione 3.0:

  • Fixed: Crash when trying to save a palette with a blank name
  • Fixed: Changing an image's DPI resolution did not set its "dirty" flag (you would not be asked to save changes)
  • Fixed: Error messages at startup were covered by the splash screen
  • Fixed: Crash when a modal dialog was open (such as an effect) when the user tried to logoff/restart/shutdown Windows, and they chose to save their images
  • Mitigated some CPU usage issues when the app was minimized and a complex selection was active

Per il download, fare clic qui.

Technorati Tags: ,

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (3) | Filed Under [ Tutto & Oltre :-) ]

Oltre Reflector

Su CodeProject è disponibile un programma chiamato AutoDiagrammer con cui è possibile generare il diagramma delle classi di un assembly .NET attraverso la Reflection... Una sorta di complemento per Reflector smile_regular:

Il programma è stato realizzato in C# e dal sito è possibile scaricare un archivio contenente sia l'eseguibile sia i codici sorgenti.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (0) |

Visual Basic .NET e i metodi case-sensitive del C#

Visual Basic .NET è case-insensitive, mentre C# fa differenza tra maiuscole e minuscole. C'è un caso in cui questo comportamento può causare problemi. La seguente classe C# compila correttamente:

1 public class TestClass 2 { 3 public void Foo(string str) 4 { 5 MessageBox.Show("Richiamata Foo con parametro " + str); 6 } 7 8 public void foo(string str) 9 { 10 MessageBox.Show("Richiamata foo con parametro " + str); 11 } 12 13 public void TestMethod(string str) 14 { 15 MessageBox.Show("Richiamata Test con parametro " + str); 16 } 17 }

Per il compilatore C#, infatti, i metodi Foo (linea 3) e foo (linea 8) sono differenti. Ma cosa succede se questa classe fa parte di una libreria il cui riferimento viene aggiunto ad un progetto Visual Basic? Per quest'ultimo Foo e foo sono la stessa cosa. In una situazione del genere, l'InstelliSense dell'editor di VB semplicemente non mostra Foo e foo tra l'elenco dei membri della classe. Se, nonostante questo, si prova a richiamare Foo (oppure foo) da VB, si ottiene il seguente messaggio in fase di compilazione:

'Foo' is ambiguous because multiple kinds of members with this name exist in class 'ClassLibrary1.TestClass'

Come fatto notare da Marco De Sanctis, un assembly che espone identificatori di questo tipo non è CLS compliant (maggiori informazioni sull'argomento sono disponibili qui).

Technorati Tags: , , ,


 

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (5) | Filed Under [ C# VB .NET ]

Powered by:
Powered By Subtext Powered By ASP.NET