C# 使用c中的只读类进行设计#

C# 使用c中的只读类进行设计#,c#,design-patterns,C#,Design Patterns,这里有一个小的设计问题。我正在尝试用C#开发一个计算应用程序。我有一个类,我们称之为InputRecord,它包含100个字段(多维数组)。这个InputRecord类将在许多计算引擎中使用。每个CalcultActionEngine都可以对InputRecord中的许多字段进行更改。这些更改是计算所需的步骤 现在我不想在其他CalcultActionEngine类中使用对InputRecord所做的本地更改 想到的第一个解决方案是使用结构:这些是值类型。但是我想使用继承:每个Calculati

这里有一个小的设计问题。我正在尝试用C#开发一个计算应用程序。我有一个类,我们称之为InputRecord,它包含100个字段(多维数组)。这个InputRecord类将在许多计算引擎中使用。每个CalcultActionEngine都可以对InputRecord中的许多字段进行更改。这些更改是计算所需的步骤

现在我不想在其他CalcultActionEngine类中使用对InputRecord所做的本地更改

想到的第一个解决方案是使用结构:这些是值类型。但是我想使用继承:每个CalculationEngine只需要几个与该引擎相关的字段:它有自己的基于BaseInputRecord的InputRecord


有人能告诉我一个可以帮助我实现这一点的设计吗?

你可以在BaseInputRecord上声明一个Clone()方法,然后将一个副本传递给每个CalculationEngine。

如果你真的有很多数据,使用结构或常用的克隆技术可能不太节省空间(例如,它会占用大量内存)

听起来像是一种需要有“主存储”和“差异存储”的设计,就像有数据文件和事务的RDBMS一样


基本上,您需要保留每个计算引擎执行的更改列表,并对不受任何更改影响的项目使用主值。

优雅的解决方案是不更改inputrecord。这将允许共享(和并行处理)


如果这不是一个选项,您将不得不克隆数据。为每个派生类指定一个构造函数,该构造函数将基本输入作为参数

克隆似乎是个好主意,您将保留完整的原始记录,其他计算引擎将有单独的副本。我曾考虑过克隆,但字段的数量使我无法使用此策略。我会考虑的