2015-12-24 20 views
11

È possibile modificare la proprietà Lunghezza di un array con una tecnica?Imposta proprietà Lunghezza array

Ho bisogno di passare prima i membri x di un array a un metodo. I requisiti del progetto mi impediscono da di allocare l'allocazione dell'heap, quindi non posso utilizzare alcun Array.Resize() o creare un nuovo array.

Non riesco a modificare il codice SetVertices perché appartiene a un'altra libreria. Ha bisogno di V[]. Non posso passare a IList<V> o V*.

public void BuildIt(V[] verts,int x){ 
    verts.Length = x; //Compile error 
    mesh.SetVertices(verts); 
} 

Ovviamente il codice non verrà compilato. Ho bisogno di alcune tecniche come i metodi di riflessione o di estensione per mascherare la matrice come piccola senza in realtà creando un array più piccolo. Voglio il metodo SetVertices() per pensare che l'array abbia membri x anche se ne ha di più.

EDIT:

verificato le seguenti approcci e non lavorano:

  • stackalloc non funziona perché non crea (o non ho potuto ottenere) un vero e proprio array.
  • Sbirciando nel progetto mono ho scoperto che la proprietà Length della matrice chiama i metodi GetLenght() e GetRank() per determinare la lunghezza. Essendo una cattiva pratica a parte, non posso sovrascrivere questo metodo con i metodi di estensione perché i metodi di istanza hanno la precedenza sui metodi di estensione (o c'è un modo per forzare il contrario?).

Iniezione successiva.

EDIT2:

cercato di emettere codice in Array.GetLength() e Array.Length. Sembra che non ci sia un modo semplice, affidabile, multipiattaforma e pulito per modificare un corpo del metodo esistente in fase di esecuzione.

+1

Penso che sia impossibile. – dotctor

+3

È quasi impossibile scrivere qualsiasi C# significativo senza allocare qualcosa. Quanto è severo, qual è la ragione sottostante? –

+0

"x" rimane uguale o cambia spesso da una chiamata all'altra? – alexm

risposta

1

Se si deve davvero fare questo con le massime prestazioni, allora è necessario conoscere il layout di memoria per particolare CLR che si utilizza (sembra essere una versione di Mono nel tuo caso). Quindi è possibile eseguire un codice non sicuro che modifica e ripristina la lunghezza dell'array. Ma è non mantenibile e pericoloso.

+1

Probabilmente dovrei rendere alcune parole in grassetto. ** CLR particolare **, ** non gestibile **, ** pericoloso ** –

1

Se gli array e x non cambiano e il loro numero non è troppo grande, è possibile assegnarli una volta globalmente, non localmente. Quindi, investi memoria e guadagni prestazioni.

Problemi correlati