过去几天有几个问题关于正确使用 null ;这里有三个(一个是我的):
在阅读和思考这个问题时,我想到了这样的想法:为什么不使用struct
代替class
? (然后我读了很多关于这个的问题。)
struct
(在此上下文中)的一个重大优势是它不能为空,因此无需检查null
。作为一个额外的好处,如果你真的想要一个空struct
,你也可以使用一些额外的语法(T?
)和Nullable<>
类型。 (太糟糕的引用类型也不像这样工作!)
但是struct
是按值传递的,这会导致性能下降。嗯,首先,代码应该是“正确的”( 可能意味着什么),然后快速。但是,有几种方法可以避免真正重要的开销:ref
参数,可以为空的参数,将struct
放在其他类中,比如List<>
。
是的,使用struct
s,您无法创建类层次结构,但“继承权被滥用”。你可以实现接口。
使用更多基于struct
的对象可以使编写多线程代码变得更容易。
struct
还有不经常引用的优点吗?这些考虑中的任何一个甚至接近于对class
的大规模“先发制人”产生影响吗?
答案 0 :(得分:3)
我认为你应该坚持使用Null Object,这样的创意会让你陷入困境,并且可能会使代码难以维护。
答案 1 :(得分:1)
struct
的最大限制(IMO)是它应该是不可变的。
我有几次定义并使用了一个用户定义的结构,因为你建议的原因(即因为结构不能为null);但是我经常(通过修改结构实例的副本(有时是未命名的临时副本)而不是修改实例本身而经常(直到我学会了永远不会使它们成为不可变的东西)。
答案 2 :(得分:0)
如果你开始在弱类型场景中使用结构(比如分配给对象类型)Object o = structValue;
或Object o = new mystruct();
或Object o = default(mystruct);
等,那么这些值会被装箱到堆上,它们是使用时也取消装箱。这是一个潜在的缺点,因为它会影响性能。请参阅Microsoft关于boxing and unboxing的信息。