业务应用程序中的c#不可变类

业务应用程序中的c#不可变类,c#,immutability,C#,Immutability,为什么以及什么时候我们需要业务或数据库应用程序中的不可变(即只读)类(我不是说string。我是说业务对象) 有谁能给我一个场景的真实例子吗?不可变类型比可变类型更容易推理-当你有一个实例的引用时,你知道你可以依靠它不改变。您可以建立一种功能性的工作方式,在这种方式下,您想要执行的任何变异都会变成一个创建新实例的操作(就像它对字符串所做的那样)——这些功能性操作可以安全地组合,不关心如果其中一个操作以特定方式更改对象会导致其他操作受损,会发生什么情况 一旦您根据不可变值的状态做出了决策,您就知道

为什么以及什么时候我们需要业务或数据库应用程序中的不可变(即只读)类(我不是说
string
。我是说业务对象)


有谁能给我一个场景的真实例子吗?

不可变类型比可变类型更容易推理-当你有一个实例的引用时,你知道你可以依靠它不改变。您可以建立一种功能性的工作方式,在这种方式下,您想要执行的任何变异都会变成一个创建新实例的操作(就像它对字符串所做的那样)——这些功能性操作可以安全地组合,不关心如果其中一个操作以特定方式更改对象会导致其他操作受损,会发生什么情况

一旦您根据不可变值的状态做出了决策,您就知道该决策对于该值仍然有效,因为该值本身无法更改

此外,不变性对于线程非常有用——当您希望跨多个线程使用单个对象时,不变性避免了很多关于数据争用等的问题


这些好处中有很多对于业务对象是有用的,但您确实需要以不同的心态处理问题。特别是,如果您的数据库行不是不可变的(即,您将修改行,而不是总是创建新的“版本”行)然后您需要意识到,任何给定的值都可能不再代表该行的数据库状态。

不可变类型比可变类型更容易推理-当您获得对实例的引用时,您知道您可以依靠它而不改变。您可以建立一种功能性的工作方式,在这种方式下,您想要执行的任何变异都会变成一个创建新实例的操作(就像它对字符串所做的那样)——这些功能性操作可以安全地组合,不关心如果其中一个操作以特定方式更改对象会导致其他操作受损,会发生什么情况

一旦您根据不可变值的状态做出了决策,您就知道该决策对于该值仍然有效,因为该值本身无法更改

此外,不变性对于线程非常有用——当您希望跨多个线程使用单个对象时,不变性避免了很多关于数据争用等的问题


这些好处中有很多对于业务对象是有用的,但您确实需要以不同的心态处理问题。特别是,如果您的数据库行不是不可变的(即,您将修改行,而不是总是创建新的“版本”行),那么您需要注意,任何给定的值都可能不再代表该行的数据库状态。

一旦您打印出发票并将其发送给客户,那张发票在时间上永远冻结了。任何调整都需要应用于后续发票。

一旦您打印出发票并将其发送给客户,该发票将被永久冻结。任何调整都需要在随后的发票上应用。

尽管Jon肯定为不可变对象的好处提出了令人信服的理由,但我会采取稍微不同的策略

当您在代码中对业务流程进行建模时,显然您要做的是使用代码中的机制来表示有关模型的事实。例如,如果客户是一种person,那么您可能有person基类和customer派生类,依此类推

不变性只是这些机制中的另一种。所以,在你的业务流程中,想想什么事情发生过一次就永远不会改变,而不是什么事情会随着时间的推移而改变

例如,考虑“客户”。顾客有名字。客户的名字是否曾经改变过?当然顾客的名字总是在变化,通常是在他们结婚的时候。那么,Customer应该是一个不可变的类吗?可能不会。从逻辑上讲,当客户更改其姓名时,您不会在旧客户的基础上创建新客户;旧客户和新客户是同一对象,但name属性已更改

现在考虑“合同”。合同会改变吗?不会。对现有合同的修订会产生新的、不同的合同。特定合同中的日期、当事人、条款等在时间上被冻结。契约对象可以是不可变的


现在一个有趣的问题是,当合同提到一个客户,而客户改变了他们的名字时,该怎么办。可变对象和不可变对象之间的相互作用使这成为一个棘手的设计问题。

尽管Jon确实为不可变对象的好处提出了令人信服的理由,但我会采取稍微不同的策略

当您在代码中对业务流程进行建模时,显然您要做的是使用代码中的机制来表示有关模型的事实。例如,如果客户是一种person,那么您可能有person基类和customer派生类,依此类推

不变性只是这些机制中的另一种。所以,在你的业务流程中,想想什么事情发生过一次就永远不会改变,而不是什么事情会随着时间的推移而改变

例如,考虑“客户”。顾客有名字。客户的名字是否曾经改变过?当然顾客的名字总是在变化,通常是在他们结婚的时候。那么,Customer应该是一个不可变的类吗?可能不会。从逻辑上讲,当客户更改其姓名时,您不会在旧客户的基础上创建新客户;旧客户和新客户是同一对象,但name属性已更改

现在考虑“合同”。合同会改变吗?不会。对现有合同的修订会产生新的、不同的合同。特定合同中的日期、当事人、条款等在时间上被冻结。契约对象可以是不可变的