我有2节课。一个处理 ReferenceType 值,另一个处理 ValueType 值。这是唯一的区别,但很重要。我正在努力为每个班级找到一个像样的名字:
- ReferenceTypeValueHandler 和 ValueTypeValueHandler?
是的,ValueTypeValue 听起来令人困惑。
- 类值处理程序和结构值处理程序?
我不应该在班级名称中使用“班级”,不是吗?
- NullableValueHandler 和 NonNullableValueHandler?
"Nullable" 已用于可空值类型 (Nullable<>)
- HeapValueHandler 和 StackValueHandler?
那是愚蠢的。利用引用类型值存储在堆中而值类型值存储在堆栈中的事实,谁在乎呢?“堆栈”也令人困惑,暗示它与堆栈有关。
还有什么想法吗?
更新:
有些人建议我应该解释这门课的目的。好吧,虽然我认为这并不重要,但它是:我正在研究 XML 到实体反序列化器。我使用 XmlReader 来利用流线读取而不是使用 DOM。当我阅读 XML 时,我会构建实体。一些实体只是其他一些实体的包装器。这些包装器可以采用单个实体或实体的集合(可枚举)。说到那些采用单个实体的实体,必须提供该实体,并且必须恰好提供一次。如果 XML 没有它,那就是个问题。如果 XML 有超过 1 个,这也是一个问题。因此,为了保持并确保在我有一个类的时候准确地提供实体ValueKeeper<TValue>
。它有2种方法TakeValue(TValue value)
和TValue ClaimValue()
. TakeValue 方法获取该值并检查之前是否已经提供了一个值,如果是,它会抛出带有适当详细信息的异常。一旦包装器 XML 的读取完成并且包装器实体必须在抓取的值上创建,则调用 ClaimValue 方法,此方法检查是否有通过 TakeValue 方法接收到的值,如果是则返回该值,如果不是,则抛出异常。现在,问题是对于引用类型值,我使用与 NULL 的比较来查看是否提供了该值。为了使这种比较成为可能,必须对 TValue 类型参数有一个通用约束:where TValue: class
. 有了这个约束,我不能将这个类用于值类型值。因此,我需要另一个执行相同操作的类,但where TValue: struct
使用Nullable<TValue>
字段对值进行操作以保持提供或尚未提供的值。现在,有 2 个类我不能只使用 ValueKeeper,我需要一个名称作为引用类型,另一个名称作为值类型值。这就是问题出现的地方。我需要一种方法来表达这种微妙的差异。但同样,类做什么并不重要,重要的是找到适当的方法来明确这种差异。