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.
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). –
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. –
@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