C# 定义类里带参数

113 阅读3分钟

在一个项目中看到这么一个类,第一次见到。

internal class ServiceProvider(IObjectContainer container, IServiceProvider? innerServiceProvider) : IServiceProvider
{}

不懂就问 ai回答

在C#中,这种直接在类定义中使用**主构造函数(Primary Constructors)**的语法是从 C# 12 开始支持的。C# 12 引入了主构造函数语法,允许在类或结构体的定义中直接声明构造函数参数,并自动将其作用域扩展到整个类或结构体。

示例代码解析

你提供的代码:

internal class ServiceProvider(IObjectContainer container, IServiceProvider? innerServiceProvider) : IServiceProvider

这是 C# 12 的主构造函数语法。它的含义是:

  1. ServiceProvider 类有两个构造函数参数:IObjectContainer container 和 IServiceProvider? innerServiceProvider
  2. 这些参数的作用域是整个类,可以在类的任何地方使用。
  3. 这个类实现了 IServiceProvider 接口。

主构造函数的特性

  1. 自动字段生成

    • 主构造函数的参数会自动生成对应的私有字段(类似于 readonly 字段),可以在类的成员中直接使用。
    • 例如,container 和 innerServiceProvider 可以在类的任何方法或属性中访问。
  2. 简化代码

    • 不需要显式定义字段或属性来存储构造函数参数。
    • 不需要显式编写构造函数的赋值逻辑。
  3. 适用于类和结构体

    • 主构造函数语法不仅适用于类,也适用于结构体。

示例代码的完整实现

以下是一个完整的示例,展示如何使用主构造函数:

internal class ServiceProvider(IObjectContainer container, IServiceProvider? innerServiceProvider) : IServiceProvider
{
    // 可以直接使用主构造函数的参数
    public object? GetService(Type serviceType)
    {
        // 使用 container 和 innerServiceProvider
        var service = container.Resolve(serviceType);
        if (service == null && innerServiceProvider != null)
        {
            service = innerServiceProvider.GetService(serviceType);
        }
        return service;
    }
}

与传统构造函数的对比

在 C# 12 之前,你需要显式定义字段并编写构造函数逻辑:

internal class ServiceProvider : IServiceProvider
{
    private readonly IObjectContainer _container;
    private readonly IServiceProvider? _innerServiceProvider;

    public ServiceProvider(IObjectContainer container, IServiceProvider? innerServiceProvider)
    {
        _container = container;
        _innerServiceProvider = innerServiceProvider;
    }

    public object? GetService(Type serviceType)
    {
        var service = _container.Resolve(serviceType);
        if (service == null && _innerServiceProvider != null)
        {
            service = _innerServiceProvider.GetService(serviceType);
        }
        return service;
    }
}

可以看到,主构造函数语法大大简化了代码。

适用场景

主构造函数语法适用于以下场景:

  1. 简单的依赖注入

    • 当你需要将依赖项注入到类中时,主构造函数可以简化代码。
  2. 不可变类型

    • 当你需要定义不可变类型时,主构造函数可以自动生成 readonly 字段。
  3. 减少样板代码

    • 当你需要减少构造函数和字段定义的样板代码时,主构造函数是一个很好的选择。

注意事项

  1. 参数作用域

    • 主构造函数的参数作用域是整个类,但不能直接在类的外部访问。
  2. 字段生成

    • 主构造函数的参数会自动生成私有字段,但如果你需要公开这些参数,仍然需要显式定义属性。
  3. C# 12 及以上版本

    • 主构造函数语法仅在 C# 12 及以上版本中支持。如果你的项目使用的是较低版本的 C#,则需要使用传统构造函数语法。

总结

  • C# 12 引入了主构造函数语法,允许在类或结构体的定义中直接声明构造函数参数。
  • 主构造函数简化了代码,自动生成字段并减少样板代码。
  • 适用于依赖注入、不可变类型等场景
  • 如果你使用的是 C# 12 或更高版本,可以尝试使用主构造函数来提高代码的简洁性和可读性。