防止使用 new() 构造对象

Prevent Construction of object using new()

在 Unity 游戏引擎中,所有从 MonoBehaviour class 派生的 classes 都不能使用 new() 运算符构造,尽管它们的默认构造函数是 public。这样做 returns Unity 日志中的警告并且对象未实例化,引用为空。

我很好奇他们是如何设法阻止在调用构造函数时创建对象的。我做了一些研究,听说在对象的构造函数中抛出异常可以阻止它的创建,所以我自己尝试了一下,当在构造函数外部处理异常时它起作用了。但是,我仍然不明白他们如何使用正确的方法 (AddComponent<T>()) 实际实例化 class。

有什么想法吗?

在普通 C# 中,new 运算符不可能 return null。它要么 return 一个有效的非空引用,要么抛出异常。

但是请注意,Unity 不是 "plain vanilla C#"。 Unity 基于 Mono(而 Mono 又基于 .NET),但根据自己的目的进行了定制。

控制编译器和运行时意味着您可以做各种非标准的事情。比如,提供一种机制,允许 new 运算符在与无效类型(即 MonoBehavior 的任何子类)一起使用时作为结果 return null。并且,例如,提供 AddComponent<T>() 可以使用的替代分配机制。

对所有这些内部工作原理的详细描述对于 Stack Overflow 来说过于宽泛(而且我也不知道具体细节)。但鉴于 Mono 是开源的,我认为该许可证是需要 Unity 对该开源的修改也可用的许可证之一。 IE。如果你真的想知道所有细节,你可以浏览实际的源代码,看看他们是如何做到的,具体来说。