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)
        {        }
    }
}

そのフォームのインスタンスを渡して、別のフォーム (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")はわかっているのに、パブリック変数にアクセスできない理由が気になるのはなぜですか?

4

2 に答える 2

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

于 2012-11-17T07:05:02.347 に答える
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)
        {        }
    }
}
于 2012-11-17T07:01:03.140 に答える