Domanda

Attualmente sto leggendo Albahari 's C # 3.0 in un Nutshell e a pag. 241, pur parlando di Array indicizzazione, dice questo:

  

array diverso da zero-based non sono   CLS (Common Language Specification) -compatibile

Che cosa significa esattamente, per le matrici diverso da zero per non essere compatibile con CLS ? E quali implicazioni ha sulla vostro codice?

[Aggiornamento]

Qui è un link a la pagina del libro.

È stato utile?

Soluzione

I CLS (Common Language Specification) pone le basi per un insieme comune di norme per il rispetto che garantisce che le altre lingue (VB.NET, C #, ecc) può utilizzare assembly che avete costruito con C #. Una matrice diversa da zero-based non sarebbe compatibile con le altre lingue si aspettano gli array di essere a base zero.

Ecco un esempio che è più facile da capire:

class Foo
{
    public void Bar() { }
    public void bar() { } 
}

Questo tipo sarebbe non essere compatibile con CLS dal momento che contiene due membri che differiscono solo di nome per tipo. Come potrebbe qualcuno usando VB.NET disambiguare tra Bar e bar dal momento che il compilatore VB.NET non è case-sensitive?

Quindi, in pratica la CLS è un po 'di regole di questo tipo per garantire l'interoperabilità tra le lingue.

Altri suggerimenti

la conformità CLS è in gran parte di fare in modo che il codice è ampiamente compatibile con le altre lingue possibili. Esso include le cose come non esporre membri pubblici che differiscono solo per caso (che sarebbe confondere VB, che è case-insensitive). Vedere questo MSDN articolo per ulteriori informazioni, insieme con il specifica del linguaggio comune stesso.

Oltre a quanto detto, non zero-based array esistono solamente per facilitare la transizione per il codice VB6 esistenti (principalmente dallo strumento di migrazione automatica) poiché in VB6, matrice indicizzazione può partire da un numero arbitrario, non necessariamente zero.

A causa del problema di conformità CLS (e altre considerazioni), non è raccomandato usarli per sempre in .NET (anche in fase di programmazione VB.NET). Inoltre, il loro uso è piuttosto limitato. E 'più facile solo per fare traduzione compensato incapsulando l'array all'interno di una classe e la scrittura di un operatore di accesso indice appropriato.

Inoltre,

Se l'applicazione non è destinato a lavorare con altri programmi -. Come in esso è un self-contained unità che non si vende come una libreria di classi pubblica ad altre persone, non ti preoccupare troppo

Ma gli altri commenti qui sono corrette durante lo sviluppo di una libreria di classi generiche.

E 'sempre buona norma usare [assembly: CLSCompliant (true)]., Ma non è fondamentale per ottenere la vostra applicazione in esecuzione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top