如何指定派生结构的默认状态应该在C#中?

Jos*_*eph 4 .net c# struct

我在SO上看到了关于无法使用无参数构造函数或不设置字段初始化器的不同问题,但我认为我的问题远远超出了这一点.

我想知道的是,我将如何设置我需要定义的结构的"默认"值?假设我正在制作TaxID结构,无论出于何种原因,默认值都必须为999-99-9999.这已经在.NET中的其他结构中完成,即DateTime.每当您声明DateTime时,该值立即设置为Jan 1 0001 12:00 AM.为什么它设置为此值而不是0/0/0000 00:00:0000 AM?必须在幕后发生一些事情,使得该值实际上在其"默认"处"有意义",即使考虑到结构对c#的限制.

Ree*_*sey 7

一般来说,这应该避免.如果您需要一个需要构造的良好的默认情况,您应该考虑更改为一个类.

结构的核心设计指南之一是:确保将所有实例数据设置为零,false或null(视情况而定)的状态有效.

有关详细信息,请参阅设计指南.


我只是在第2版的设计指南中看了这一部分,他们有一个详细的例子,使用属性和非常规覆盖来解决这个问题.基本概念是以0为"良好默认值"的方式私下保存值,并在每个属性和方法覆盖中执行某种形式的转换(包括ToString).在他们的例子中,他们使用正整数作为示例,并始终将curVal-1保存在私有成员中,因此默认值(0)被视为值为1.他们添加了一个带有int val的构造函数,并保存内部价值-1等

这似乎是很多隐藏的,意外的开销 - 所以我个人仍然建议(并使用)这种情况下的类.

---编辑以回应评论---

作为您的示例,DateTime是它的方式,因为在午夜0 == 1/1/0001.DateTime使用单个ulong来表示1/1/0001的刻度.这就是为什么(从这里):

"DateTime值类型表示日期和时间,值范围为午夜12:00,1月1日,000 Anno Domini(公共时代)到公元9999年12月31日晚上11:59:59"(CE)

这是蜱中的全方位ulong.当您转换为字符串时,DateTime结构中的"0"被视为1/1/0001 - 值不是1 + 1 + .... - 它是单个0.