2012-07-03 123 views
3

有沒有人有把ref byte轉換成byte[]的經驗?如何將ref字節轉換爲byte []?

如果函數取像

void foo(ref byte buffer); 

參數則有可能使用

void call_func() 
{ 
    byte arr[] = new byte[10]; 
    foo(ref arr[0]); 
} 

的問題是如何可以在一個所述buffer參數重新轉換成byte[]陣列中的調用foofoo

+7

如果您需要傳遞數組,爲什麼不傳遞數組? C#不是C. – Vlad

+0

您應該放棄您的一些c/C++習慣...... –

+0

@khkarens:C++/CLI比讓C#調用現有的C++代碼比SWiG更好。 –

回答

8

你不知道。

爲了避免固定整個數組,運行時可能會複製所選的單個元素(然後在調用後複製)。在這種情況下,你的函數將獲得臨時副本的地址,這與其他數組元素的地址無關。 (好吧,there could be some aliasing considerations,這種優化更有可能用於拼音和/或遠程調用,其中混疊分析更可行)

如果您需要數組,請傳遞數組。


如果您不在意它可能無法正常工作,您可以使用不安全的代碼來訪問其他元素。

pinned(byte* p = &buffer) { 
    buffer[4] = 0; 
} 
+0

+1,你會搞砸任何人試圖調試你的代碼的大腦,如果你做 –

+0

謝謝@BenVoigt! 似乎我有一個原因來調查swig的行爲(瞭解爲什麼暴露refsbyte而不是ref sbyte []從unsigned char *)。解釋清楚。 – khkarens

+0

Ben,C#中[ref](http://msdn.microsoft.com/en-us/library/14akc2c7.aspx)的定義似乎與你解釋的內容矛盾。他們說_傳遞引用的效果是,方法中參數的任何變化都會反映在調用方法中的基礎變量變量中。因此,我沒有得到優化器如何才能引用引用的想法並傳遞臨時價值? – khkarens