在 C# 中,虽然不像 Java 那样直接支持匿名类的实例化,但可以通过 委托(Delegate) 或 匿名方法/ Lambda 表达式 来实现类似的功能。以下是几种实现方式:
1. 使用接口 + 匿名方法
C# 支持通过匿名方法或 Lambda 表达式来实现接口的方法。假设 Callback
是一个接口:
示例代码
using System;
// 定义 Callback 接口
public interface Callback
{
void onSuccess();
}
public class IOHelper
{
// 定义 setOnClick 方法
public static void SetOnClick(Callback callback)
{
callback.onSuccess(); // 调用回调方法
}
}
class Program
{
static void Main(string[] args)
{
// 使用匿名方法实现 Callback 接口
IOHelper.SetOnClick(new CallbackAnonymous());
// 或者使用 Lambda 表达式实现 Callback 接口
IOHelper.SetOnClick(new CallbackLambda());
}
}
// 使用匿名方法实现 Callback 接口
public class CallbackAnonymous : Callback
{
public void onSuccess()
{
Console.WriteLine("通过匿名方法调用 onSuccess!");
}
}
// 使用 Lambda 表达式实现 Callback 接口
public class CallbackLambda : Callback
{
public void onSuccess()
{
Action action = () => Console.WriteLine("通过 Lambda 表达式调用 onSuccess!");
action();
}
}
2. 使用委托(推荐方式)
C# 提供了更简洁的方式——委托(Delegate),可以直接传递方法而不需要显式实现接口。
示例代码
using System;
// 定义一个委托类型
public delegate void Callback();
public class IOHelper
{
// 定义 setOnClick 方法,接受一个委托作为参数
public static void SetOnClick(Callback callback)
{
callback?.Invoke(); // 调用委托
}
}
class Program
{
static void Main(string[] args)
{
// 使用匿名方法或 Lambda 表达式传递回调
IOHelper.SetOnClick(() =>
{
Console.WriteLine("onSuccess 被调用了!");
});
}
}
3. 使用 Action
泛型委托
C# 提供了一些内置的泛型委托(如 Action
和 Func
),可以直接用于简化代码。对于无返回值的方法,可以使用 Action
。
示例代码
using System;
public class IOHelper
{
// 定义 setOnClick 方法,接受一个 Action 作为参数
public static void SetOnClick(Action callback)
{
callback?.Invoke(); // 调用回调
}
}
class Program
{
static void Main(string[] args)
{
// 使用 Lambda 表达式传递回调
IOHelper.SetOnClick(() =>
{
Console.WriteLine("onSuccess 被调用了!");
});
}
}
- 总结
Java 的匿名类:C# 不直接支持匿名类,但可以通过 委托 或 Lambda 表达式 实现类似功能。
推荐方式:使用 委托(Delegate) 或 内置泛型委托(如 Action 或 Func),它们更加简洁且符合 C# 的编程习惯。
如果需要严格模拟 Java 的匿名类行为,可以创建一个匿名类并实现接口,但这通常不是最佳实践。