为什么在没有先将动作分配给任何动作的情况下调用动作是合法的?

Spe*_*ick 5 c# delegates

我对C#中的Actions的理解是它们只是委托的特定版本,即没有参数且没有返回类型的委托.

如果我创建这样的类......

class TrainSignal
{
    public delegate void TrainsAComing();

    public void HerComesATrain()
    {
        TrainsAComing();
    }
}
Run Code Online (Sandbox Code Playgroud)

...它不会编译,因为我还没有创建委托的实例.但是,如果我将委托定义替换为如下所示的Action,则编译:

class TrainSignal
{
    public Action TrainsAComing;

    public void HerComesATrain()
    {
        TrainsAComing();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想也许一个Action可能是静态的或类似的东西(从而允许我们通过它的名称来调用它而不实例化它)但似乎并非如此.

谁能解释为什么第二个代码块是合法的?

das*_*ght 4

这条线

public delegate void TrainsAComing();
Run Code Online (Sandbox Code Playgroud)

定义一个名为 的公共委托类型TrainsAComing,嵌套在您的类中。这将允许用户创建 类型的委托TrainSignal.TrainsAComing,但TrainSignal没有成员来存储此类委托的实例。

换句话说,委托的声明不定义委托类型的成员。您需要另一个声明:

class TrainSignal
{
    public delegate void TrainsAComing(); // The delegate type

    public TrainsAComing OnTrainsAComing; // The member of delegate type

    public void HerComesATrain()
    {
        OnTrainsAComing();
    }
}
Run Code Online (Sandbox Code Playgroud)

Action另一方面,已经是一种类型,类似于delegate TrainsAComing您的示例。因此,定义

public Action TrainsAComing;
Run Code Online (Sandbox Code Playgroud)

使TrainsAComing成员TrainSignal能够存储委托。