C# 如何确保火灾事件的安全,无论签名是什么?

C# 如何确保火灾事件的安全,无论签名是什么?,c#,delegates,C#,Delegates,鉴于我有不同签名的代表: public event Action Del1; public event Action<int> Del2; 以下方法适用于第一个委托,但当然不适用于第二个委托: protected void FireEvent( Action action ) { if( action != null ) { action(); } } 有什么我可以使用的基本行动吗 谢谢 如果您使用的是c6,则可以使用null条件运算符执行

鉴于我有不同签名的代表:

public event Action Del1;
public event Action<int> Del2;
以下方法适用于第一个委托,但当然不适用于第二个委托:

protected void FireEvent( Action action )
{
    if( action != null )
    {
        action();
    }
}
有什么我可以使用的基本行动吗


谢谢

如果您使用的是c6,则可以使用null条件运算符执行该检查,而无需使用安全方法

利用空条件运算符,整个集合实现简化为:

OnTemperatureChanged?调用此,值

我创建了一个.net fiddle来演示这一点:

它产生输出:

一个

两个12

一个是空的

两个12

二是零

完成


通常您可以安全地将操作称为:Action?.Invoke或Action?.invokeParam,这意味着您无论如何都需要签名。谢谢您的努力。是的,这很好,我们仍然使用.NET4.5,但这似乎是一个很好的未来解决方案。C版本与.NET版本是分开的。您应该能够在VS 2015和VS 2017中使用C 6功能。本文档描述了C 6(C的下一个版本)中的新语言功能。所有这些功能都在VS 2015中实现并可用。
protected void FireEvent( Action action )
{
    if( action != null )
    {
        action();
    }
}
using System;
                    
public class Program
{
    public static void Main()
    {
        Action actionOne = () => { Console.WriteLine("One"); };
        Action<int> actionTwo = (int foo) => { Console.WriteLine("Two " + foo); };
        
        actionOne?.Invoke();
        actionTwo?.Invoke(12);
        
        actionOne = null;
        
        Console.WriteLine("One is null");
        
        actionOne?.Invoke();
        actionTwo?.Invoke(12);
        
        actionTwo = null;
        
        Console.WriteLine("Two is null");
        
        actionOne?.Invoke();
        actionTwo?.Invoke(12);
        
        Console.WriteLine("Done");
    }
}