Formazione
Modulo
Chiamare i metodi dalla libreria di classi .NET usando C# - Training
Usare le funzionalità nella libreria di classi .NET chiamando metodi che restituiscono valori, accettano parametri di input e altro ancora.
Questo browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
In questa esercitazione si apprenderà il significato del controllo delle versioni in .NET. Verranno anche presentati i fattori da considerare durante il controllo delle versioni della libreria e verrà descritto l'aggiornamento a una nuova versione di una libreria.
Il compilatore C# fa parte di .NET SDK. Per impostazione predefinita, il compilatore sceglie la versione del linguaggio C# corrispondente al TFM scelto per il progetto. Se la versione dell'SDK è successiva a quella del framework scelto, il compilatore potrebbe usare una versione del linguaggio successiva. È possibile modificare l'impostazione predefinita impostando l'elemento LangVersion
nel progetto. Per altre informazioni, vedere l'articolo sulle opzioni del compilatore.
Avviso
Si sconsiglia di impostare l'elemento LangVersion
su latest
. L'impostazione latest
indica che il compilatore installato utilizza la versione più recente. Questo può cambiare da un computer a un altro, rendendo le compilazioni inaffidabili. Inoltre, abilita le funzionalità del linguaggio che potrebbero richiedere funzionalità del runtime o della libreria non incluse nell'SDK corrente.
Gli sviluppatori che hanno creato le librerie .NET per uso pubblico probabilmente si sono trovati in situazioni in cui è necessario distribuire i nuovi aggiornamenti. Le modalità di gestione di questo processo sono molto importanti poiché è necessario garantire che non si verifichino problemi durante la transizione del codice esistente alla nuova versione della libreria. Ecco alcuni aspetti da considerare quando si crea una nuova versione:
Versionamento Semantico (SemVer per brevità) è una convenzione di denominazione applicata alle versioni della libreria per indicare cardine specifici. In teoria, le informazioni sulla versione applicate alla libreria consentono agli sviluppatori di determinare la compatibilità con i progetti che usano versioni precedenti di quella libreria.
L'approccio di base a SemVer è il formato a 3 componenti MAJOR.MINOR.PATCH
, dove:
MAJOR
viene incrementato quando si apportano modifiche incompatibili all'APIMINOR
viene incrementato quando si aggiungono funzionalità compatibili con le versioni precedentiPATCH
viene incrementato quando si apportano correzioni dei bug compatibili con le versioni precedentiEsistono anche modi per specificare altri scenari, ad esempio le versioni non definitive, quando si applicano le informazioni sulla versione alla libreria .NET.
Quando si rilasciano nuove versioni della libreria, la compatibilità con le versioni precedenti probabilmente è una delle principali preoccupazioni. Una nuova versione della libreria è compatibile a livello di codice sorgente con una versione precedente se il codice che dipende dalla versione precedente, quando viene ricompilato, funziona con la nuova versione. Una nuova versione della libreria è compatibile a livello binario se un'applicazione che dipende dalla versione precedente funziona, senza ricompilazione, con la nuova versione.
Di seguito sono riportati alcuni aspetti da considerare quando si tenta di gestire la compatibilità della libreria con le versioni precedenti:
Nota
Rendere obbligatori gli argomenti facoltativi ha un impatto molto limitato, soprattutto se non modifica il comportamento del metodo.
Più è facile per gli utenti eseguire l'aggiornamento alla nuova versione della libreria, più rapido sarà l'aggiornamento.
Gli sviluppatori .NET molto probabilmente hanno trovato il file app.config
nella maggior parte dei tipi di progetto.
Questo semplice file di configurazione è in grado di ottimizzare la distribuzione dei nuovi aggiornamenti. In genere è consigliabile progettare le librerie in modo che le informazioni che probabilmente cambieranno regolarmente vengano memorizzate nel file app.config
. Quando le informazioni vengono aggiornate è sufficiente sostituire il file di configurazione delle versioni precedenti con il nuovo file senza dover ricompilare la libreria.
Uno sviluppatore che elabora librerie .NET compilate da altri sviluppatori probabilmente sa che una nuova versione di una libreria potrebbe non essere completamente compatibile con il progetto e che spesso è necessario aggiornare il codice perché funzioni con le modifiche.
Sia C# che l'ecosistema .NET offrono funzionalità e tecniche che consentono di aggiornare facilmente l'applicazione in modo che funzioni con le nuove versioni delle librerie che potrebbero introdurre modifiche che causano un'interruzione.
È possibile usare il file config.app per aggiornare la versione di una libreria usata dall'applicazione. Aggiungendo un reindirizzamento di binding è possibile usare la nuova versione della libreria senza dover ricompilare l'applicazione. Nell'esempio seguente viene illustrato come aggiornare il file dell’applicazione config.app per usare la versione di patch 1.0.1
di ReferencedLibrary
anziché la versione 1.0.0
con cui è stata compilata in origine.
<dependentAssembly>
<assemblyIdentity name="ReferencedLibrary" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" />
<bindingRedirect oldVersion="1.0.0" newVersion="1.0.1" />
</dependentAssembly>
Nota
Questo approccio funziona solo se la nuova versione di ReferencedLibrary
è compatibile a livello binario con l'applicazione.
Vedere la sezione Compatibilità con le versioni precedenti per verificare quando deve essere determinata la compatibilità.
Usare il modificatore new
per nascondere i membri ereditati di una classe di base. In questo modo le classi derivate possono rispondere agli aggiornamenti nelle classi di base.
Ad esempio:
public class BaseClass
{
public void MyMethod()
{
Console.WriteLine("A base method");
}
}
public class DerivedClass : BaseClass
{
public new void MyMethod()
{
Console.WriteLine("A derived method");
}
}
public static void Main()
{
BaseClass b = new BaseClass();
DerivedClass d = new DerivedClass();
b.MyMethod();
d.MyMethod();
}
Output
A base method
A derived method
Nell'esempio precedente si può vedere come DerivedClass
nasconde il metodo MyMethod
presente in BaseClass
.
Ciò significa che quando una classe di base nella nuova versione di una libreria aggiunge un membro già esistente nella classe derivata, è sufficiente usare il modificatore new
per il membro della classe derivata per nascondere il membro della classe di base.
Se non si specifica alcun modificatore new
, una classe derivata nasconderà per impostazione predefinita i membri in conflitto in una classe di base e il codice verrà comunque compilato anche se viene generato un avviso del compilatore. Ciò significa che la semplice aggiunta di nuovi membri a una classe esistente rende la nuova versione della libreria compatibile sia a livello di codice sorgente che a livello binario con il codice che dipende da essa.
Il modificatore override
indica che un'implementazione derivata estende l'implementazione di un membro della classe di base anziché nasconderlo. È necessario che al membro della classe di base sia applicato il modificatore virtual
.
public class MyBaseClass
{
public virtual string MethodOne()
{
return "Method One";
}
}
public class MyDerivedClass : MyBaseClass
{
public override string MethodOne()
{
return "Derived Method One";
}
}
public static void Main()
{
MyBaseClass b = new MyBaseClass();
MyDerivedClass d = new MyDerivedClass();
Console.WriteLine("Base Method One: {0}", b.MethodOne());
Console.WriteLine("Derived Method One: {0}", d.MethodOne());
}
Output
Base Method One: Method One
Derived Method One: Derived Method One
Il modificatore override
viene valutato in fase di compilazione e il compilatore genera un errore se non trova un membro virtuale di cui eseguire l'override.
La conoscenza delle tecniche discusse e della comprensione delle situazioni in cui usarle andrà a lungo per facilitare la transizione tra le versioni di una libreria.
Feedback su .NET
.NET è un progetto di open source. Selezionare un collegamento per fornire feedback:
Formazione
Modulo
Chiamare i metodi dalla libreria di classi .NET usando C# - Training
Usare le funzionalità nella libreria di classi .NET chiamando metodi che restituiscono valori, accettano parametri di input e altro ancora.