C# IXmlSerializable和不变性

C# IXmlSerializable和不变性,c#,immutability,explicit-interface,C#,Immutability,Explicit Interface,我正在一个不可变的类中实现IXmlSerializable。为了使类保持不变,我显式地实现了接口,以便隐藏方法,并使用了一个静态的ReadXml()方法,该方法封装了ReadXml(XmlReader)方法,并返回我的类的一个新实例。但是,假设该类被称为ClassA,我被迫实现IXmlSerializable的方式意味着 ((ClassA)((IXmlSerializable)(ClassAOObject)).ReadXml(reader)) 实际上变异了ClassAObject,因为在IXml

我正在一个不可变的类中实现
IXmlSerializable
。为了使类保持不变,我显式地实现了接口,以便隐藏方法,并使用了一个静态的
ReadXml()
方法,该方法封装了
ReadXml(XmlReader)
方法,并返回我的类的一个新实例。但是,假设该类被称为
ClassA
,我被迫实现
IXmlSerializable
的方式意味着

((ClassA)((IXmlSerializable)(ClassAOObject)).ReadXml(reader))

实际上变异了
ClassAObject
,因为在
IXmlSerializable.ReadXml
中,我正在为已经创建的对象的参数赋值。也就是说,
ClassAObject
仍然可以被认为是不可变的吗?

显式实现接口并不是为了“隐藏”方法——只是为了避免当两个接口定义具有相同签名的成员时出现歧义。“隐藏”方面也是可用的,但只是为了防止您自己的代码中出现错误——您必须显式地强制转换对象,这意味着您知道自己在做什么

添加:但是。。。在调用了
ReadXml()
之后,您可以通过“锁定”一个不可变对象来非常接近它,因此对它的进一步调用将引发异常。因此,对象在被读取后变得不可变。如果对象是由另一个构造函数(而不是无参数构造函数)构造的,那么如果您还锁定了该对象,那就太好了。这取决于您首先想要不变性的原因,可以满足您的需要。

显式实现接口并不是为了“隐藏”方法——只是为了避免当两个接口定义具有相同签名的成员时出现歧义。“隐藏”方面也是可用的,但只是为了防止您自己的代码中出现错误——您必须显式地强制转换对象,这意味着您知道自己在做什么


添加:但是。。。在调用了
ReadXml()
之后,您可以通过“锁定”一个不可变对象来非常接近它,因此对它的进一步调用将引发异常。因此,对象在被读取后变得不可变。如果对象是由另一个构造函数(而不是无参数构造函数)构造的,那么如果您还锁定了该对象,那就太好了。根据您为什么要首先考虑不可变性,这可能符合您的需要。

< P>我认为您应该考虑数据传输对象(DTOS),它将有公共的吸收器/设置器来传输序列化的对象数据。

< P>我认为您应该考虑数据传输对象(DTOS)。它将使用公共getter/setter来传输序列化的对象数据