c#:在类实例化时创建一个什么都不做的Action

本文关键字:什么 一个 Action 实例化 创建 | 更新日期: 2023-09-27 17:52:43

我有一个类,用户可以将Action传递给(或不传递)。

public class FooClass<T> : BaseClass<T>
{
    public FooClass()
        : this((o) => ()) //This doesn't work...
    {
    }
    public FooClass(Action<T> myAction)
        : base(myAction)
    {
    }
}


基本上,我不能为Action传递null到我的基类。但是,同时我不想强迫我的用户传递一个Action。相反,我希望能够动态地创建一个"什么都不做"的操作。

c#:在类实例化时创建一个什么都不做的Action

你想说

this(t => { })

这样想。你需要t => anonymous-expression-body。在本例中,anonymous-expression-bodyexpressionblock。你不能有一个空表达式,所以你不能用expression指示一个空的方法体。因此,您必须使用block,在这种情况下,您可以说{ }来指示block具有空的statement-list,因此是空的主体。

具体请参见语法规范附录b

这是另一种思考它的方式,这是一种你可以用来自己发现的方式。Action<T>是一个接受T并返回void的方法。您可以通过非匿名方法或匿名方法定义Action<T>。您试图弄清楚如何使用匿名方法(或者更确切地说,一个非常特殊的匿名方法,即lambda表达式)来实现它。如果你想通过一个非匿名方法来实现这个功能你可以输入

private void MyAction<T>(T t) { }

然后你可以说

this(MyAction)

,它使用方法组的概念。但是现在你想把它转换成一个表达式。我们取那个方法体,让它成为lambda表达式。因此,我们扔掉private void MyAction<T>(T t),用t =>代替它,并逐字复制方法体{ }

this(t => { })

不应该是花括号吗?

public FooClass()
        : this(o => {})
    {
    }

Lambda形式为(/*paramaters*/) => {/*body*}

参数周围的圆括号可以省略,但主体周围的大括号只有在单个(非空)语句时才能省略。

相关文章: