C# 默认情况下代理是静态的吗?

C# 默认情况下代理是静态的吗?,c#,static,delegates,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

我只是想用下面的代码来理解代理

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);

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

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

内部类(&enum&delegate)不需要引用类实例。您可以把它看作一种名称空间,而不是一个成员


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

在您的示例中,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);

+1给布赖恩。在他的答案中添加一段代码片段

您不是在声明类成员,而是在定义一个新的嵌套类型。请参阅下面的代码示例。。。定义嵌套委托就是创建从MultiCastDelegate派生的新嵌套类型(如嵌套类)

唯一重要的是嵌套类型的前面-例如,如果将委托标记为Private,则不能在包含类型之外创建

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


谢谢委托类型是delegatesEx(?)类的成员。那么,如果不为类创建实例,如何访问它呢?我不确定是否可以称之为access@Sri库马尔:我已经更新了我的答案,希望能解决这个问题。如果您需要进一步的信息,请告诉我。您不需要这么详细,也可以编写delegatesEx.Mydelegate myAddDelegates=add;
var del = new A.DoSomethingWithAnInt(Print);
del.Invoke(10);

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