如果我使用委托,我需要这些方法是静态的

本文关键字:方法 静态 如果 | 更新日期: 2023-09-27 18:11:39

我有一个这样的c#代码:

using System;
delegate int anto(int x);
class Anto 
{
    static void Main()
    {
        anto a = square;
        int result = a(3);
        Console.WriteLine(result);
    }
    static int square(int x)
    {
        return x*x;
    }
}

输出的是:9。好吧,我是c#新手,所以我开始玩这个代码,所以当我从square方法中删除static关键字时,然后我得到这样的错误:

An object reference is required to access non-static member `Anto.square(int)'
Compilation failed: 1 error(s), 0 warnings

是什么导致这个错误?所以如果我用delegates,我需要的方法是static ?

我在这里运行这个代码

提前感谢。

如果我使用委托,我需要这些方法是静态的

因为Main是静态的,所以它只能引用其他静态成员。如果从square中删除static,它将成为一个实例成员,而在Mainstatic上下文中,没有任何对象的实例,因此实例成员是无效的。

值得庆幸的是,委托并没有发生什么疯狂的事情,这就是static的工作方式——它表明成员对于一个类型是全局的,而不是该类型的实例。

必须是静态的,因为它在静态方法中使用。您需要一个Anto的实例来使您的示例工作。

var myAnto = new Anto();
anto a = myAnto.square;

这是未经测试的,可能无法编译基于Anto.square的保护级别。

不需要是静态的。你可以给委托分配一个非静态方法,但是如果它是非静态的,那么你需要实例化一个类型为Anto的对象:

Anto anto = new Anto();
anto a = anto.square;

在这里是相当没有意义的,因为该方法不访问任何实例成员。它是静态的更有意义。

静态方法可以在创建实例之前调用,必须是静态方法。

如有必要,

可以写成如下形式

anto a = (x)=>x*x ;