我找到了一个很好的用java编写的代码示例,用于使用timer / timertask类......
我目前正在将其转换为c#以实现'Mono for Android'实现,但是在转换抽象类TimerTask的内联实现方面遇到了麻烦
// Here's the original java code
private void resetMapChangeTimer()
{
mChangeDelayTimer.schedule(
new TimerTask()
{
@Override
public void run()
{
// Some code to run
}
}, longTenSeconds);
}
当我在c#中实现它时,我想在线创建一个从TimerTask(抽象类)和run方法等继承的类,而不必像上面的java代码那样创建一个单独的类(扩展TimerTask)。
任何人都可以建议我使用c#语法创建这个抽象类内联而不是创建一个单独的类来继承和实现TimerTask吗?
答案 0 :(得分:8)
C#不支持Java中的内联类。您可以定义匿名方法,但不能定义整个类。因此,您必须定义一个实现抽象类的单独类。
答案 1 :(得分:5)
正如达林所说,匿名功能是走到这里的方式。您只是尝试指定一点行为,因此只需让方法接受Action
,然后调用者就可以使用匿名函数(匿名方法或lambda表达式)。调用代码如下所示:
changeDelayTimer.Schedule(() => {
// Code to run
}, TimeSpan.FromSeconds(10));
或者,如果您有很多代码,那么您需要使用方法组转换:
changeDelayTimer.Schedule(MethodContainingCode, TimeSpan.FromSeconds(10));
在Java中,我很少发现我想做的事情不仅仅是覆盖匿名内部类中的单个方法 - 所以C#中的匿名函数几乎总是在这里工作。
将代码从Java移植到C#时,重要的是不要试图保留Java惯用语 - 保留相同的目标,而是移植到.NET习惯用法,在这种情况下使用委托代理用抽象的方式表示一个单一的行为。
答案 2 :(得分:1)
如果要使用/扩展现有Java类,可以实现通用帮助程序类:
class MyTimerTask: TimerTask
{
private Action action;
public MyTimerTask(Action action)
{
this.action = action;
}
public override void Run()
{
if(action != null)
action();
}
}
然后您可以使用匿名方法:
mChangeDelayTimer.Schedule(new MyTimerTask(() =>
{
//Do something
}), longTenSeconds);
要在项目中获得最佳C#体验,您可以进一步添加扩展方法。在项目的某处创建一个公共静态类:
public static class TimerHelper
{
public static void Schedule(this DelayTimer /*or whatever your timer class is*/ timer, Action action, int delay)
{
if(timer == null)
throw new ArgumentNullException("timer"); //null check needed because this method is not really an instance method
timer.Schedule(new MyTimerTask(action), delay);
}
}
然后你可以使用下面的代码:( TimerHelper类必须对执行上下文“可见”,才能显示扩展方法,因此它是公共的)
mChangeDelayTimer.Schedule(() =>
{
//Do something
}, longTenSeconds);