2012-11-17 75 views
2

最近我發現,如果我有一個表格(比如說from2),其中有在它宣佈爲(我知道代表沒有連接到任何東西)爲什麼不通過類實例訪問公共代理?

namespace SomeTest 
{ 
    public partial class Form2 : Form 
    { 
     public delegate void mydelegate(string some); 

     public Form2() 
     { InitializeComponent();} 


     private void Form2_Load(object sender, EventArgs e) 
     {  } 
    } 
} 

現在,如果我通過實例的公衆代表這種形式說另一個窗體(Form)本身

namespace SomeTest 
{ 
    public partial class Form1 : Form 
    { 
     Form2 fm = null; 
     public Form1(Form2 fm_) 
     { 
      this.fm = fm_; 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //Why cant fm access the public delegate ? 
     } 
    } 
} 

爲什麼我們不能去喜歡fm.begininvoke(fm.mydelegate,"SomeParameter")我知道委託未連接到的東西,但我只是好奇,爲什麼一個公共變量是無法訪問?

回答

5

委託是一種類型 - 這就是爲什麼您可以從類訪問它,但不能從實例訪問它。考慮一個枚舉的情況下:

public class Foo 
{ 
    public enum Bar { A, B, C }; 
    public Bar Baz; 
} 

這裏Bar是一個類型,但Baz是一個對象 - 所以Foo.Bar是有效的,但不是Foo.Baz。同樣,如果你有一個實例var foo = new Foo();那麼foo.Bar是無效的,但是foo.Baz沒問題。

您的代理類型mydelegate就像本例中的Bar


如果你想添加委託的實例:

public partial class Form2 
{ 
    public delegate void mydelegate(string some); 
    public mydelegate mydelegateImpl = new mydelegate(arg => Console.WriteLine(arg)); 
} 

...然後你可以從Form2實例訪問mydelegateImpl

3

你可以訪問它,你只需要使用類名稱而不是實例名稱。

namespace SomeTest 
{ 
    public partial class Form1 : Form 
    { 
     Form2 fm = null; 
     public Form1(Form2 fm_) 
     { 
      this.fm = fm_; 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Form2.mydelegate // Works. 
      fm.mydelegate // Won't work. 
     } 
    } 
} 

爲什麼?因爲代表不是字段或屬性。在類中定義委託更類似於在類中定義類。你知道這可能嗎?

namespace SomeTest 
{ 
    public delegate void mydelegate(string some); 

    public partial class Form2 : Form 
    { 

     public Form2() 
     { InitializeComponent();} 


     private void Form2_Load(object sender, EventArgs e) 
     {  } 
    } 
} 
相關問題