代理默认是静态的吗?

时间:2010-04-14 07:03:06

标签: c# static delegates

我只是试图使用以下代码来理解代理。

public class delegatesEx
{
    public delegate int Mydelegate(int first, int second);

    public int add(int first, int second)
    {
        return first + second;
    }
    public int sub(int first, int second)
    {
        return first - second;
    }
}

这是我的主要方法

Console.WriteLine("******** Delegates ************");
delegatesEx.Mydelegate myAddDelegates = new delegatesEx.Mydelegate(new delegatesEx().add);
int addRes = myAddDelegates(3, 2);
Console.WriteLine("Add :" + addRes);

delegatesEx.Mydelegate mySubDelegates = new delegatesEx.Mydelegate(new delegatesEx().sub);
int subRes = mySubDelegates(3, 2);
Console.WriteLine("Sub :" + subRes);

我没有声明委托是静态的,但我能够使用类名访问它。怎么可能?

4 个答案:

答案 0 :(得分:5)

您没有在类中声明变量,而是声明名为MyDelegate的新委托类型。因为这是一个静态类型声明,实例并不真正适用。在main方法中,您声明该类型的实际变量。同样,您可以在类上创建类型为MyDelegate的实例和静态成员。

答案 1 :(得分:3)

在您的示例中,Mydelegate实际上是delegatesEx中的嵌套类型。嵌套类型不与外部类的任何特定实例相关联。当你像这样声明它时,你基本上只是将外部类用作一种命名空间。如果您只是将这一行移到了类定义之外,那么您的应用程序将起到相同的作用。

public delegate int Mydelegate(int first, int second);

将您的参考文件从delegatesEx.Mydelegate更改为Mydelegate。

Mydelegate myAddDelegates = new Mydelegate(new delegatesEx().add);
Mydelegate mySubDelegates = new Mydelegate(new delegatesEx().sub);

答案 2 :(得分:1)

内部类(& enums& delegates)不需要引用类实例。你可以把它想象成一种命名空间而不是一个成员。

如果您正在将C#与java进行比较,那么我认为所有内部类型在java意义上都算作“静态” - 他们可以访问它们的外部类私有,但是他们首先需要引用外部类。

答案 3 :(得分:1)

+1给Brian。添加一个代码片段给他的答案。

您没有声明一个类成员 - 而是您正在定义一个新的嵌套类型。请参阅下面的代码示例...定义嵌套委托正在创建一个派生自MultiCastDelegate的新嵌套类型(如嵌套类)。

唯一重要的access modifiers位于嵌套类型的前面 - 例如如果将委托标记为“私有”,则无法在包含类型之外创建。

class A 
{
  public delegate void DoSomethingWithAnInt(int x);
  public class InnerA
  {
    public void Boo() 
    { Console.WriteLine("Boo!"); }
  }
}

client func()

var del = new A.DoSomethingWithAnInt(Print);
del.Invoke(10);

var obj = new A.InnerA();
obj.Boo();