Action和Delegate之间的可访问性

时间:2014-09-30 09:24:40

标签: c# .net delegates

在下面的代码中,我创建了一个名为Mhd的委托 - 就像Action代表一样。
我的问题:如果两位代表是公开,为什么只有Action委托从另一个类而不是Mhd可见?

static void Main(string[] args)
    {
        new Test().Yaser(); //this can be done
        new Test().mhd(); //this can not be done
    }
    class Test
    {
        public Action Yaser;
        public delegate void Mhd();
    }

    //and Action definition is   public delegate void Action();

感谢任何帮助:)

3 个答案:

答案 0 :(得分:2)

为了使我的答案有意义,记住代表的定义很重要。根据{{​​3}}:

  

委托是一种引用类型,可用于封装命名或匿名方法。

代表是参考?!?!

如果您熟悉C ++,您知道另一种说法 引用 的方式是 指针 。 (事实上​​,C ++开发人员通过函数指针为C#委托提供类似的功能。)

代表被引用的重要性是什么?在通用类型系统提供的基本结构中,.NET Framework具有另一种引用类型:class。说委托是引用类型就像说委托是一个类。让我们回顾一下我们如何使用课程。

在使用类的实例之前,您需要遵循3个步骤:

  • 类型声明:class Test { public Action Yaser; }
  • 实例声明:class Test testClassObject;
  • 实例化:testClassObject = new Test();

(通常,我们将实例声明和实例化结合起来)。

我们说代表是班级。因此,委托使用遵循相同的模式:

  • 类型声明:public delegate void Mhd();
  • 实例声明:public Mhd myMhd;
  • 实例化:myDelegateField = new Mhd(SomeMethod);

但等等,SomeMethod是什么?确实,这并不重要。我们所知道的只是它的签名必须与Mhd的签名相匹配。换句话说,void SomeMethod()

让我们检查并修复您的班级声明。可能的实现如下所示:

class Test
{
    public Action Yaser;        // instance declaration
    public delegate void Mhd(); // type declaration
    public Mhd myMhd;           // instance declaration

    public Test()
    {
        // instantiation
        this.myMhd = new Mhd(this.SomeMethod);
    }

    private void SomeMethod()
    {
        // your implementation
    }
}

答案 1 :(得分:1)

    public Action Yaser;

声明类型为Action的字段,而

    public delegate void Mhd();

Mhd声明为委托类型。

答案 2 :(得分:0)

因为Mhd不是您班级的成员。它是您在班级中声明的委托类型。

所以你不能像成员方法或属性一样对待它,但你可以用它来声明那种类型的变量

Test.Mhd myDelegate;