C# 中的非空 class 默认值
Non-null class default in C#
如果我 default(RefType)
我得到 null
。如果我 default(ValType)
我得到一个 ValType
和 default
-ed 属性。没关系。
但我想要一个具有 val 类型 default
语义的引用类型;特别是对于子类型。这可能吗?
说,我公开了一个接口,IExtension
。
有人将其实现为 class as FooExtension
我怎样才能最轻松地获得 FooExtension
的“default
”实例作为 "empty" class(同样重要的是,派生自 FooExtension
的类型)而不必更改实施?
这对我很重要;我需要创建派生类型的非 null
、"empty" 实例,以便它们可以由动态 UI.
填充
我猜答案是通过反射迭代属性的效果,但也许有更好的(阅读:更干净的)方法。
我只想使用结构,但是不可继承的约束,再加上我描述的错误类型的语义,让我很警惕(阅读:不)
tl;dr:如何获得默认的 classes,如默认结构,隐式支持继承。
一个选项是FormatterServices.GetUninitializedObject
,它分配一个实例而不调用任何构造函数。通常,除非您最终调用其中一种类型的构造函数或完全初始化对象,否则这会让人非常困惑。顾名思义,它用于从序列化数据创建对象,但可能没有 0 元构造函数。
如果我 default(RefType)
我得到 null
。如果我 default(ValType)
我得到一个 ValType
和 default
-ed 属性。没关系。
但我想要一个具有 val 类型 default
语义的引用类型;特别是对于子类型。这可能吗?
说,我公开了一个接口,IExtension
。
有人将其实现为 class as FooExtension
我怎样才能最轻松地获得 FooExtension
的“default
”实例作为 "empty" class(同样重要的是,派生自 FooExtension
的类型)而不必更改实施?
这对我很重要;我需要创建派生类型的非 null
、"empty" 实例,以便它们可以由动态 UI.
我猜答案是通过反射迭代属性的效果,但也许有更好的(阅读:更干净的)方法。
我只想使用结构,但是不可继承的约束,再加上我描述的错误类型的语义,让我很警惕(阅读:不)
tl;dr:如何获得默认的 classes,如默认结构,隐式支持继承。
一个选项是FormatterServices.GetUninitializedObject
,它分配一个实例而不调用任何构造函数。通常,除非您最终调用其中一种类型的构造函数或完全初始化对象,否则这会让人非常困惑。顾名思义,它用于从序列化数据创建对象,但可能没有 0 元构造函数。