Scrittura di codice compatibile con CLS
La compatibilità con CLS (Common Language Specification) si riferisce solitamente al rispetto delle regole e delle restrizioni definite da CLS. Il concetto ha tuttavia un significato più specifico, a seconda che la definizione di compatibile con CLS si riferisca al codice o a uno strumento di sviluppo quale un compilatore. Gli strumenti di sviluppo compatibili con CLS possono facilitare la scrittura di codice compatibile con CLS.
Codice compatibile con CLS
Se si desidera che il proprio codice sia compatibile con CLS, occorre esporre le funzionalità secondo i canoni della compatibilità con CLS nei seguenti punti:
Definizioni delle classi pubbliche.
Definizioni dei membri pubblici delle classi pubbliche e dei membri accessibili alle classi derivate (accesso family).
Parametri e tipi restituiti dei metodi pubblici delle classi pubbliche e dei metodi accessibili alle classi derivate.
Non è necessario che le funzionalità utilizzate nelle definizioni delle proprie classi private, nelle definizioni dei metodi privati su classi pubbliche e nelle variabili locali osservino le regole CLS. È inoltre possibile scrivere il codice che implementa le proprie classi utilizzando funzionalità di qualsiasi linguaggio e producendo comunque un componente compatibile con CLS.
Nota
Le matrici di matrici sono compatibili con CLS. In .NET Framework versione 1.0 il compilatore C# segnala per errore che non sono compatibili.
È possibile contrassegnare assembly, moduli, tipi e membri come compatibili con CLS o non compatibili con CLS utilizzando CLSCompliantAttribute. Tutti gli assembly che si desidera rendere compatibili con CLS dovranno essere contrassegnati come tali. Un assembly che non è contrassegnato come compatibile con CLS è considerato non compatibile con CLS. Se a un tipo non viene applicato alcun attributo CLS, tale tipo verrà considerato come avente la stessa compatibilità con CLS dell'assembly in cui è definito. Analogamente, se a un membro non viene applicato alcun attributo CLS, il membro verrà considerato come avente la stessa compatibilità con CLS del tipo che lo definisce. Non è possibile contrassegnare come compatibile con CLS un programma che include elementi non contrassegnati come compatibili con CLS. Nell'esempio riportato alla fine di questo argomento viene illustrato l'utilizzo di CLSCompliantAttribute.
Assembly, moduli e tipi possono essere compatibili con CLS anche se alcune parti relative non sono tali, purché vengano rispettate due condizioni:
Se l'elemento è contrassegnato come compatibile con CLS, le parti non compatibili con CLS devono essere contrassegnate utilizzando CLSCompliantAttribute con l'argomento false.
Per ciascun membro non compatibile con CLS deve essere fornito un corrispondente membro alternativo compatibile con CLS.
Se si progetta una libreria di classi compatibile con CLS, questa potrà interagire con un'ampia gamma di linguaggi di programmazione. È pertanto prevedibile che tale libreria disporrà di una clientela potenziale più ampia di quella che potrebbe avere una corrispondente versione non compatibile con CLS.
.NET Framework fornisce una libreria di classi compatibile con CLS. Per ulteriori informazioni sull'utilizzo di questa libreria di classi, vedere Riferimento alla libreria di classi .NET Framework.
Strumenti compatibili con CLS
I linguaggi che si avvalgono del runtime supportano le funzionalità di CLS e osservano le regole delle specifiche CLS per i compilatori. I compilatori per tali linguaggi semplificano il conseguimento della compatibilità con CLS mettendo i tipi di dati e le funzionalità di CLS a disposizione degli sviluppatori che creano componenti. I livelli di compatibilità con CLS offerti da compilatori e altri strumenti sono descritti di seguito:
Strumenti consumatori compatibili con CLS.
Gli strumenti consumatori sono linguaggi che consentono agli sviluppatori di accedere a tutte le funzionalità fornite dalle librerie compatibili con CLS. Gli sviluppatori che utilizzano tali linguaggi potrebbero non essere in grado di estendere le librerie compatibili con CLS tramite la creazione di nuovi tipi, ma possono utilizzare tutti i tipi definiti in una libreria compatibile. Tale livello di compatibilità può essere utile quando si desidera accedere alla libreria di classi .NET Framework, ma non occorre creare nuovi oggetti che potranno essere utilizzati da altri, così come avviene quando si utilizzano Web Form su una pagina ASP.NET o quando si crea un'interfaccia utente Windows Form.
Strumenti di estensione compatibili con CLS.
Gli strumenti di estensione sono linguaggi che consentono agli sviluppatori sia di utilizzare che di estendere i tipi definiti nelle librerie compatibili con CLS. Gli sviluppatori possono utilizzare i tipi esistenti o definirne di nuovi. Gli strumenti di estensione devono seguire tutte le regole a cui sono soggetti gli strumenti consumatori, nonché alcune regole aggiuntive descritte nella specifica relativa a Common Language Infrastructure, Partition I, disponibile sul sito MSDN all'indirizzo https://msdn.microsoft.com/net/ecma.
Per la progettazione dei propri componenti compatibili con CLS, può essere utile utilizzare uno strumento compatibile con CLS. La scrittura di componenti compatibili con CLS senza tale supporto risulta più difficile perché si potrebbe non disporre di tutte le funzionalità di CLS che si desidera utilizzare.
Alcuni compilatori di linguaggi compatibili con CLS, quali il compilatore C# o Visual Basic, consentono di specificare che si desidera produrre codice compatibile con CLS. Tali compilatori possono verificare la compatibilità con CLS ed emettere un avviso quando il codice creato utilizza funzionalità non supportate da CLS. I compilatori C# e Visual Basic consentono di contrassegnare un elemento del programma come compatibile con CLS. La mancanza di tale contrassegno induce il compilatore a generare un errore in fase di compilazione. Ad esempio, il codice C# riportato di seguito non verrà compilato.
using System;
// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]
// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
// ChangeValue exposes UInt32, which is not in CLS.
// A compile-time error results.
public void ChangeValue(UInt32 value){ }
public static void Main( ) {
int i = 2;
Console.WriteLine(i);
}
}
Tale codice genererà l'errore riportato di seguito.
error: CS3001: Argument type 'uint' is not CLS-compliant.
Per non generare l'errore, è sufficiente indicare che ChangeValue non è compatibile, come illustrato nell'esempio che segue.
using System;
// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]
// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
// Method marked as not compliant.
[CLSCompliantAttribute(false)]
public void ChangeValue(UInt32 value){ }
public static void Main( ) {
int i = 2;
Console.WriteLine(i);
}
}
Il codice sopra riportato non provoca errori di compilazione. L'output è 2
.
Per ulteriori informazioni su come specificare la compatibilità del proprio codice con CLS, vedere la documentazione del compilatore del linguaggio che si utilizza.
Vedere anche
Concetti
Cenni preliminari sull'interoperabilità dei linguaggi