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
。相反,我希望能够动态地创建一个"什么都不做"的操作。
你想说
this(t => { })
这样想。你需要t => anonymous-expression-body
。在本例中,anonymous-expression-body
为expression
或block
。你不能有一个空表达式,所以你不能用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*}
参数周围的圆括号可以省略,但主体周围的大括号只有在单个(非空)语句时才能省略。