选项类型是结构体的良好候选者吗?
本文关键字:候选者 类型 结构体 选项 | 更新日期: 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
一样传递选项,它也会避免装箱/拆箱。
我设计并实现了一个期权系统。我认为解决这个问题的最好方法是有一个基类"选项"。我之所以认为它应该是一个类,是因为大多数应用程序的选项往往会随着时间的推移而增长。(如果您正在扩展模块,编写新代码等)