哪个是使用委托的正确方法?

Myr*_*rez 2 c#

我想两个人知道两者之间是否存在差异,如果它们是相同的哪个是更好的做法?

第一类:

Action onDeath;
public void RegisterDeath(Action callback) 
{
    onDeath += callback;
}
Run Code Online (Sandbox Code Playgroud)

然后让其他类2订阅这个RegisterDeath方法?或者做得更好:

public Action onDeath;
//or even
public event Action onDeath;
Run Code Online (Sandbox Code Playgroud)

并且在主类中没有杂乱地订阅这个公共委托?如果存在差异,可能会有人简要解释一下

Adr*_*ian 7

如果您公开公开委托,则每个人都可以重置调用列表,甚至可以调用委托:

class Test
{
    public static Action MyAction;
}

Test.MyAction = () => Console.WriteLine("Hello"); // Resets invocation list
Test.MyAction(); // Invokes delegate
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,这是不受欢迎的行为.这就是C#拥有event关键字的原因.事件只能订阅(使用+=)或取消订阅(使用-=).

class Test
{
    public static event Action MyAction;
}

Test.MyAction = () => Console.WriteLine("Hello"); // Not allowed
Test.MyAction(); // Not allowed
Test.MyAction += () => Console.WriteLine("Hello"); // Only this is allowed
Run Code Online (Sandbox Code Playgroud)

使用您自己的方法RegisterDeath可以让您更好地控制委托(un)订阅的方式和时间.但在许多情况下,简单event就足够了.