我最近发现,如果我有一个表格(比如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")
那样知道代理人没有附加某些内容,但我只是好奇为什么公共变量无法访问?
答案 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
没问题。
在此示例中,您的委托类型mydelegate
与Bar
类似。
如果您想添加委托的实例:
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)
{ }
}
}