2015-12-24 59 views
11

是否可以使用某種技術更改數組的長度屬性?設置數組的長度屬性

我需要將數組的第一個x個成員傳遞給方法。該項目要求阻止我從分配任何堆分配,所以我不能使用任何Array.Resize()或創建一個新的數組。

另外我無法更改SetVertices代碼,因爲它屬於另一個庫。它需要V[]。我不能通過IList<V>V*它。

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

當然代碼不會編譯。我需要一些像反射或擴展方法的技術來將數組僞裝成較小的而不是實際上創建了一個較小的數組。我想SetVertices()方法認爲數組有x個成員,即使它有更多。

編輯:

測試了以下的方法和他們不工作:

  • stackalloc不起作用,因爲它不創建(或我無法獲得)真正的陣列。
  • 偷看到單聲道項目中我發現數組的Length屬性調用GetLenght()和GetRank()方法來確定長度。拋開一個不好的做法,我不能用擴展方法重寫此方法,因爲實例方法優先於擴展方法(或者有其他方法強制執行)。

接下來會嘗試代碼注入。

EDIT2:

試圖以發射代碼到Array.GetLength()Array.Length。看起來沒有簡單,可靠,跨平臺和乾淨的方式來在運行時更改現有的方法體。

+1

我認爲這是不可能的。 – dotctor

+3

在沒有分配任何東西的情況下編寫任何有意義的C#幾乎是不可能的。這有多嚴格,其根本原因是什麼? –

+0

「x」保持不變,或者它經常從一次呼叫變爲另一次呼叫? – alexm

回答

1

如果你真的需要以最高的性能來做到這一點 - 那麼你必須知道內存佈局特別是 CLR你使用(似乎是你的情況下的一些版本的單聲道)。然後你可以做一些不安全的代碼來改變和恢復數組長度。但它的不可維護危險

+1

大概我必須做一些字體大膽。 **特定的CLR **, **不可維護**, **危險** –

1

如果數組和x沒有變化並且數字不是很大,那麼您可以在全局中分配它們一次,而不是在本地分配它們。所以,你會投資記憶並獲得表現。