在 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# 提供了一些内置的泛型委托(如 ActionFunc),可以直接用于简化代码。对于无返回值的方法,可以使用 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 被调用了!");
        });
    }
}
  1. 总结
    Java 的匿名类:C# 不直接支持匿名类,但可以通过 委托 或 Lambda 表达式 实现类似功能。
    推荐方式:使用 委托(Delegate) 或 内置泛型委托(如 Action 或 Func),它们更加简洁且符合 C# 的编程习惯。
    如果需要严格模拟 Java 的匿名类行为,可以创建一个匿名类并实现接口,但这通常不是最佳实践。