选项类型是结构体的良好候选者吗?

本文关键字:候选者 类型 结构体 选项 | 更新日期: 2023-09-27 18:06:27

请考虑以下不可变类型:

public class/struct AServiceOptions {
    public AServiceOptions (Uri baseAddress, int workersCount, TimeSpan maxIdleTime) {
        BaseAddress = baseAddress;
        WorkersCount = workersCount;
        MaxIdleTime = maxIdleTime;
    }
    public Uri BaseAddress { get; }
    public int WorkersCount { get; }
    public TimeSpan MaxIdleTime { get; }
}

用法如下:

public class AService {
    public AService (AServiceOptions options) {
        Options = options;
        Initialize();
    }
    AServiceOptions Options { get; }
    private void Initialize () {
        InitHttpClient(Options.BaseAddress);
        InitWorkers(Options.WorkersCount);
        InitTimer(Options.MaxIdleTime);
    }
    // Service implementation details
}

AServiceOptions类型是Struct的好候选吗?为什么/为什么不?

选项类型是结构体的良好候选者吗?

不,因为这种类型的实例适合在调用堆栈期间共享,并且您知道结构体是值,所以当将其作为方法的参数传递时,您不会共享相同的对象,但是您创建了副本,除非您使用ref关键字。

总之,它应该是一个

请参阅另一个问题&A以获得关于何时使用结构体的更多细节:

这不是一个很好的备选struct,因为所有的AService对象将被限制使用相同的选项实现,没有继承子类特定选项的可能性。

对于struct:

这是不可能的
public struct AServiceOptions {
}
public struct ADerivedServiceOptions : AServiceOptions { // Not possible
}
public class AService {
    public AService(AServiceOptions opt) ...
}
public class ADerivedService {
    public ADerivedService (ADerivedServiceOptions opt) ...
}

此外,struct不会"买"给你任何东西:一个不可变的类也一样好,如果你需要像object一样传递选项,它也会避免装箱/拆箱。

我设计并实现了一个期权系统。我认为解决这个问题的最好方法是有一个基类"选项"。我之所以认为它应该是一个类,是因为大多数应用程序的选项往往会随着时间的推移而增长。(如果您正在扩展模块,编写新代码等)