2009-05-22 79 views
3

當我試圖通過一個公共變量的這樣的地址:傳遞公共變量的地址

ML.Register("Radius", &lBeacons[i].Radius, 0.0f, 200.0f, 10.0f); 

我得到這個錯誤:

error CS0212: You can only take the address of an unfixed expression inside of a fixed statement initializer 

的註冊功能如下:

public unsafe void Register(string desc, float* val, float minimum, float maximum, float stepsize) 

信標是一個列表。它擁有公共半徑的課程。

+2

我召喚Jon Skeet!整個指針引用類和結構體在csharp中是他最喜歡的主題。 – 2009-05-22 14:02:12

+2

重新評論「我想將ML中的地址(和其他人)存儲在ML中以備將來的事情」 - 不!不要這樣做! .NET對象四處移動;你不能依賴固定塊之外的指針(這應該是短暫的)。將Radius對象(引用)傳遞到ML,並更新Radius對象的屬性。 – 2009-05-22 14:10:53

+0

(我的意思是Beacon對象) – 2009-05-22 14:16:14

回答

2

爲什麼要使用指針?您可以使用「ref」關鍵字來傳遞變量的引用。

例如:

object blah = new object(); 

CallMethod(ref blah); 


public void CallMethod(ref object param) 
{ 

} 
+0

是的,我忘了提到我想將ML的地址(和其他)存儲在ML中以備將來的事情......這就是爲什麼我使用指針(和我的C++思想) – JustFogMaxi 2009-05-22 14:08:01

7

難道沒有意義的只是通過引用傳遞的價值?

public void Register(string desc, ref float val, float minimum, 
     float maximum, float stepsize) {...} 

當然,使用公共變量(領域)是一個壞主意太...它的工作就像這樣:

ML.Register("Radius", ref lBeacons[i].Radius, 0.0f, 200.0f, 10.0f); 

不會工作,如果你做一個Radius財產 - 所以不要這樣做。考慮傳遞信標(或類似的)本身,或其他基於對象(或可能是基於事件)的機制。


類似:

ML.Register("Radius", lBeacons[i], 0.0f, 200.0f, 10.0f); 

有:

private Beacon beacon; 
public void Register(string desc, Beacon beacon, float minimum, 
     float maximum, float stepsize) { 
    this.beacon = beacon; 
} 
void Foo() { 
    beacon.Radius++; // etc 
} 

在這裏,我們有一個參考信標對象,它不具有指針unsafe問題。如果您不想直接公開Beacon,請考慮使用接口。

0

您可以嘗試使用固定塊。

fixed(float *rad = &(lBeacons[i].Radius))) { 
    ML.Register("Radius", rad, 0f, 200f, 10f); 
} 

我不認爲你想這樣做在任何情況下。如果ML在固定塊外使用弧度,則很可能會失敗。我認爲你最好重新思考你的API。

4

爲了得到一個指針到一個變量,使用固定關鍵字到管腳它的地方,如:

fixed(float *radius=&lBeacons[i].Radius) 
{ 
    ML.Register("Radius", radius, 0.0f, 200.0f, 10.0f); 
} 

這獲取放置在需要被聲明爲不安全的方法。