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