2011-08-06 36 views
-4

在下面的代碼,確實ptrcall ...點指針在C#代表方法

  • 到與方法obj.callMeobj1.callMe堆2米的地方;或...
  • to 1 place that contains obj.callMeobj1.callMe in it?

    public delegate void CallEveryOne(); 
    
    private void Form1_Load(object sender, EventArgs e) 
    { 
    
    public CallEveryOne ptrcall=null; 
    
    public Form2 obj = new Form2(); 
    public Form3 obj1 = new Form3(); 
    
        obj.Show(); 
        obj1.Show(); 
    
        ptrcall += obj.CallMe; 
        ptrcall += obj1.CallMe; 
    } 
    
+7

有道理這個問題沒有。 –

+0

像Yoda一樣說話! – Mrchief

+0

我的bab魚剛剛死亡。 – Amy

回答

4
ptrcall

是,像從.NET 2.0開始,一個多播委託基本上所有代表。也就是說,它保留了它所引用的內部方法列表。 MSDN有以下說MulticastDelegate

代表一個多播委託;也就是說,在其調用列表中可以有多個元素的代理。  (重點由我加的)

所以,在您的術語,答案很有可能是ptrcall點2處上堆。

但是爲什麼這個實現細節至關重要?


P.S:您能夠打電話ptrcall.GetInvocationList(),看看你會得到什麼。我只向你推薦這樣做,讓你更好地瞭解代表,並更好地瞭解代表。除非你真的不得不

+0

是否有可能委託一次指向2位? –

+0

是的,這正是你的代碼所做的,以及MulticastDelegate提供的。如果您調用委託,* * obj.CallMe和obj1.CallMe將被調用。 – stakx

+0

感謝stakx編輯我的問題和快速回復 –

0

我想你想知道這與非託管係數互操作? Ptrcall存儲對類型爲CallEveryOne的對象實例的引用(該類型來自MulticastDelegate類型)。該對象包含(除其他外)內部數組,其中包含有關添加到此代理的每種方法的信息,但您不打算直接使用它。如果您需要指向預訂方法的指針,請使用ptrcall.GetInvocationList()獲取方法列表,並使用System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate()將其轉換爲指針。

+0

你的答案基本上是正確的,@Nuf。但是,我發現你使用了諸如_「ptrcall指向......」這樣的術語有問題。 'ptrcall'是**不是** a *指針*!我覺得那些相當陌生的人。應該鼓勵.NET或C#儘早熟悉價值和引用類型的基礎知識,並停止思考實現細節(@ Mehdi在這裏想到的術語_「heap」_的使用;這個概念也是如此的指針,這在C#中很少使用)。見例如[Eric Lippert的這些博客文章](http://blogs.msdn.com/b/ericlippert/archive/tags/memory+management/)。 – stakx

+0

@stakx:當然,ptrcall是**不是**指針,它是可變的,可將**引用**保存到對象。我不是這個詞,「分」這個詞意味着ptrcall指向一個指針(不是),但我仍然修改了我的答案(希望)以防止任何混淆。 – Nuf