为什么在C#中使用委托时需要使用STATIC函数?
class Program
{
delegate int Fun (int a, int b);
static void Main(string[] args)
{
Fun F1 = new Fun(Add);
int Res= F1(2,3);
Console.WriteLine(Res);
}
**static public int Add(int a, int b)**
{
int result;
result = a + b;
return result;
}
}
答案 0 :(得分:12)
这不是“必要的”。但您的 Main 方法为static
,因此无法调用非static
方法。尝试这样的事情(这不是一个很好的做事方式 - 你真的应该创建一个新类,但它不会改变你的样本):
class Program
{
delegate int Fun (int a, int b);
void Execute()
{
Fun F1 = new Fun(Add);
int Res= F1(2,3);
Console.WriteLine(Res);
}
static void Main(string[] args)
{
var program = new Program();
program.Execute();
}
int Add(int a, int b)
{
int result;
result = a + b;
return result;
}
}
答案 1 :(得分:8)
你的函数需要是静态的,因为你是从静态方法Main调用的。您可以使方法非静态:
class Program
{
delegate int Fun (int a, int b);
static void Main(string[] args)
{
Program p = new Program(); // create instance of Program
Fun F1 = new Fun(p.Add); // now your non-static method can be referenced
int Res= F1(2,3);
Console.WriteLine(Res);
}
public int Add(int a, int b)
{
int result;
result = a + b;
return result;
}
}
答案 2 :(得分:1)
在这种情况下,因为您没有创建任何类的实例,所以唯一的选择是静态函数。如果要实例化Program类型的对象,则可以使用实例方法。
答案 3 :(得分:1)
代表基本上遵循与方法相同的规则。在提供的示例中,您的委托必须是静态的,因为您是从静态方法调用它。同样,这也行不通:
static void Main(string[] args)
{
int Res = Add(3, 4);
Console.WriteLine(Res);
}
public int Add(int a, int b)
{
int result;
result = a + b;
return result;
}
但是,如果您将事物移动到这样的非静态上下文中:
class MyClass
{
public MyClass()
{
Fun F1 = new Fun(Add);
int Res = F1(2, 3);
Console.WriteLine(Res);
}
public int Add(int a, int b)
{
int result;
result = a + b;
return result;
}
}
您可以拥有一个非静态方法的委托。
答案 4 :(得分:-1)
无需创建传递委托的静态方法。
但非静态方法应该在不同的类中声明,并且必须使用该类的实例进行访问。
DelegateName DN = new DelegateName(类的实例。方法名称)