簡體   English   中英

地址替代C#中的替代

[英]AddressOf alternative in C#

任何人都可以幫我解決一下C#中有關VB6中AddressOf運算符的替代解決方案嗎? AddressOf返回一個long值。 我可以用什么方式獲得C#中的輸出?

擴展Harper Shelby的答案,是的,它可以完成,但在.NET中這通常是代碼味道。

要在C#中獲取變量的地址,可以使用C樣式指針(*)/地址(&)/解除引用( - >)語法。 為此,您必須使用/ unsafe編譯器開關編譯應用程序,因為只要您開始直接處理內存地址,就會從托管代碼的安全網中彈出。

來自MSDN的樣本講述了大部分故事:

int number;
int* p = &number;
Console.WriteLine("Value pointed to by p: {0}", p->ToString());

這將number變量的地址分配給指向int的指針p

對此有一些關注:

  1. 必須初始化要獲取其地址的變量。 值類型不是問題,默認情況下,但它是引用類型的問題。
  2. 在.NET中,變量可以在內存中移動而不會讓您意識到它。 如果你需要處理變量的地址,你真的想使用fixedfixed RAM中的變量。
  3. &只能應用於變量,而不是常量或值。 (換句話說,你不能使用像int* p = &GetSomeInt();這樣的構造int* p = &GetSomeInt();
  4. 同樣,您的代碼必須以不安全模式進行編譯,該模式標記您將使用托管代碼“安全網”之外的功能的CLR。

一般來說,我在這個世界上的建議是認真考慮為什么你認為你需要在.NET世界中這樣做。 .NET的任務之一是保護開發人員不要違背金屬,這個功能與這個任務背道而馳。 它適用於需要它的那些(罕見)場景; 如果你發現自己輕率地使用它只是因為你可以,你可能會誤用它並引入代碼味道。

盡可能避免使用它,但如果你絕對必須知道如何使用它。

C#具有為委托/事件分配函數的特殊語法。 只需使用<delegate> += <function>;

如果你真的試圖獲得其他用途的地址,那你就不走運了。 托管代碼的一個問題是這些地址不一定是固定的。 雖然大多數功能都不可能改變,但在某些情況下這是可能的。

顯然,這可以做到(雖然我不確定你需要它在哪里)。 這是MSDN頁面

EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
    // ....
}

兩種表示法都是等效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM