2013-11-24 18 views
7

Studiando i meccanismi interni della CLI, mi accorgo che è possibile per tipo di firme per specificare limiti di matrice Per esempio, invece di avere (in fase di compilazione.):fase di compilazione limiti di matrice

Byte[,]

possiamo avere:

Byte[1...100,1...]

Se non mi sbaglio, non è possibile dichiarare in realtà i tipi come quest'ultimo sia in C# o C++/CLI. Inoltre, ECMA-335 indica:

Il VES crea un tipo di matrice per ciascun tipo di matrice distinguibile. In generale, i tipi di array si distinguono solo per il tipo dei loro elementi e il loro rango.

Il Common Language Specification (CLS) impone una serie di restrizioni, tra cui:

Solo il fatto che un oggetto è una matrice e il tipo di elemento dell'array sono necessario distinguere tra sovraccarichi.

così sembra che il supporto per limiti di matrice a tempo di compilazione è presente ai livelli più bassi della CLI, ma non altrove. Questo mi porta a chiedermi:

  • Quando una firma di tipo che include questa informazione viene mai creata/incontrata nella pratica? Esistono linguaggi .NET che do emettono questo? EDIT: Ci sono lingue che probabilmente do usano array basati su un solo array - ma codificano questo nelle firme del tipo?

  • Da dove viene il CLI effettivamente uso queste informazioni se è presente? (Questo in particolare è di interesse per me come io sto progettando un'implementazione CLI.)

Per quanto posso vedere, qualsiasi array è creato sia utilizzando l'istruzione newarr bytecode per i vettori, o Array.CreateInstance per la caso generale. Nessuno di questi meccanismi accetta una firma di tipo per lo dell'array stesso, quindi la creazione sembra non poter utilizzare queste informazioni.

In teoria, questa informazione può essere utile per ottimizzare l'accesso dell'array mediante l'inlining del codice macchina efficiente per il calcolo dell'indirizzo. Tuttavia, ldelem e gli amici accedono solo a vettori semplici; l'accesso ad array multidimensionale richiede una chiamata al metodo, il che mi fa pensare che una tale ottimizzazione probabilmente non avvenga.

Devo pensare che ci sia qualche scopo per questo meccanismo, in modo che sia diventato uno standard internazionale, ma non lo vedo davvero.

+0

Come commento, poiché questa è solo una mia congettura personale: alcuni linguaggi consentono indici di inizio matrice personalizzati, in contrapposizione alle lingue basate su C su cui è stato modellato C#. La CLI supporta comunque gli indici di avvio personalizzati e i compilatori per i linguaggi basati su Pascal come [Oxygene] (http://www.remobjects.com/oxygene/) o [A #] (http://asharp.martincarlisle.com/) potrebbe benissimo emettere quel tipo di array. Gli array basati su zero possono essere creati in C# con la riflessione con [questo sovraccarico di 'Array.CreateInstance'] (http://msdn.microsoft.com/en-us/library/x836773a%28v=vs.110% 29.aspx). –

+0

Oh, e le informazioni saranno sicuramente utilizzate dalla CLI almeno quando il metodo ['Array.GetLowerBound'] (http://msdn.microsoft.com/en-us/library/system.array.getlowerbound%28v = vs.110% 29.aspx) è invocato. –

+0

@ORMapper: Avevo la sensazione che potesse esistere un linguaggio che usasse tali limiti .. tuttavia, si noti che l'overload di 'Array.CreateInstance' che si menziona prende effettivamente i limiti come argomenti e quindi non usa le informazioni dalla _type signature_ . Allo stesso modo, 'Array.GetLowerBound' sta accedendo alle informazioni su un'istanza _runtime_. So che le basi dirette non zero possono essere utilizzate in _runtime_ - la mia preoccupazione è più sul perché questa informazione possa essere inclusa staticamente in _type signature_. – Kevin

risposta

1

Questa informazione appare solo nella firma del tipo di matrice, non è disponibile in runtime senza accedere ai membri dell'oggetto della matrice. Questo è importante per le lingue che considerano gli array con limiti diversi come tipi distinti, la lingua Pascal ne è un esempio.Tratta una variabile di tipo array[1..10] of integer come distinta e incompatibile con una variabile di tipo array[1..11] of integer.

+0

Ora che lo metti in questo modo sono riuscito a trovare alcune citazioni nelle specifiche che aggiungono un po 'di chiarezza .. bada se le aggiungo alla tua risposta? – Kevin

+0

Certo, la modifica delle risposte è interamente accettabile. –

Problemi correlati