Scrittura di codice conforme a 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 conforme a CLS si riferisca al codice o a uno strumento di sviluppo quale un compilatore. Gli strumenti di sviluppo conformi a CLS possono facilitare la scrittura di codice conforme a CLS.

Codice compatibile con CLS

Se si desidera che il proprio codice sia conforme a 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 conforme a CLS.

NotaNota

Le matrici di matrici sono conformi a 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 conformi a CLS o non conformi a CLS utilizzando CLSCompliantAttribute. Tutti gli assembly che si desidera rendere conformi a CLS dovranno essere contrassegnati come tali. Un assembly che non è contrassegnato come conforme a CLS è considerato non conforme a 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 conforme a CLS un programma che include elementi non contrassegnati come conformi a CLS. Nell'esempio riportato alla fine di questo argomento viene illustrato l'utilizzo di CLSCompliantAttribute.

Assembly, moduli e tipi possono essere conformi a CLS anche se alcune parti relative non sono tali, purché vengano rispettate due condizioni:

  • Se l'elemento è contrassegnato come conforme a CLS, le parti non conformi a CLS devono essere contrassegnate utilizzando CLSCompliantAttribute con l'argomento false.

  • Per ciascun membro non conforme a CLS deve essere fornito un corrispondente membro alternativo conforme a CLS.

Se si progetta una libreria di classi conforme a 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 conforme a CLS.

.NET Framework fornisce una libreria di classi conforme a CLS. Per ulteriori informazioni su questa libreria di classi, vedere Riferimento a .NET Framework.

Strumenti conformi a 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 conformi a CLS.

    Gli strumenti consumatori sono linguaggi che consentono agli sviluppatori di accedere a tutte le funzionalità fornite dalle librerie conformi a CLS. Gli sviluppatori che utilizzano tali linguaggi potrebbero non essere in grado di estendere le librerie conformi a CLS tramite la creazione di nuovi tipi, ma possono utilizzare tutti i tipi definiti in una libreria conforme. 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 conformi a CLS.

    Gli strumenti di estensione sono linguaggi che consentono agli sviluppatori sia di utilizzare che di estendere i tipi definiti nelle librerie conformi a CLS. Gli sviluppatori possono utilizzare i tipi esistenti o definirne di nuovi. Gli strumenti Extender devono seguire tutte le regole a cui sono soggetti gli strumenti di tipo consumer, nonché alcune regole aggiuntive descritte nella specifica relativa a Common Language Infrastructure, Partition I - Architecture, disponibile nel sito Web Microsoft Developer Network (MSDN) (informazioni in lingua inglese).

Per la progettazione dei propri componenti conformi a CLS, può essere utile utilizzare uno strumento conforme a CLS. La scrittura di componenti conformi a 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 conformi a CLS, quali il compilatore C# o Visual Basic, consentono di specificare che si desidera produrre codice conforme a 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 conforme a CLS. La mancanza di tale contrassegno induce il compilatore a generare un errore in fase di compilazione. Il codice seguente, ad esempio, genera un avviso del compilatore:

<Assembly: CLSCompliant(True)>

<CLSCompliant(True)> Public Class MyCompliantClass
   Public Sub ChangeValue(value As UInt32)
   End Sub

   Public Shared Sub Main()
      Dim i As Integer = 2
      Console.WriteLine(i)
   End Sub   
End Class
using System;

// Assembly marked as compliant.
[assembly: CLSCompliant(true)]

// Class marked as compliant.
[CLSCompliant(true)]
public class MyCompliantClass {
   // ChangeValue exposes UInt32, which is not in CLS.
   // A compile-time warning results.
   public void ChangeValue(UInt32 value){ }

   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

Il codice genera l'avviso C# seguente:

warning CS3001: Argument type 'uint' is not CLS-compliant

o l'avviso Visual Basic seguente:

warning BC40028: Type of parameter 'value' is not CLS-compliant.

Per non generare l'avviso, è sufficiente indicare che ChangeValue non è conforme, come illustrato nell'esempio seguente.

' Assembly marked as compliant.
<Assembly: CLSCompliant(True)>

' Class marked as compliant.
<CLSCompliant(True)> Public Class MyCompliantClass
   ' Method marked as not compliant.
   <CLSCompliant(False)> Public Sub ChangeValue(value As UInt32)
   End Sub

   Public Shared Sub Main()
      Dim i As Integer = 2
      Console.WriteLine(i)
   End Sub   
End Class
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);
   }
}

Questo codice non produce avvisi del compilatore. 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

Interoperabilità tra linguaggi diversi