为什么公共代表不能通过类实例访问?

时间:2012-11-17 06:58:53

标签: c# .net delegates

我最近发现,如果我有一个表格(比如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)
        {        }
    }
}

现在,如果我将该表单的实例传递给另一个表单(form1),那么

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")那样知道代理人没有附加某些内容,但我只是好奇为什么公共变量无法访问?

2 个答案:

答案 0 :(得分:6)

委托是一种类型 - 这就是为什么你可以从类中访问它,而不是从实例访问它。考虑枚举的情况:

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没问题。

在此示例中,您的委托类型mydelegateBar类似。


如果您想添加委托的实例:

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

...然后您就可以从mydelegateImpl的实例访问Form2

答案 1 :(得分: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)
        {        }
    }
}