通常情况下,我应该在什么时候使用反射与(浅层)克隆方法?
如果我的所有类都有空白构造函数,那么使用反射很好,或者写更好吗
Clone()
{
return new MyClass();
}
方法?
我可以看到Clone
方法更安全,因为它可以在编译时进行检查,但哪个更快,什么时候使用反射更好?
更新。我不是在寻找一个特定问题的解决方案,而是想学习更多的理论来理解如何处理这种性质的问题。
然而,从某种意义上讲,我正在制作一款游戏,我经常会遇到这个问题。例如,游戏允许用户"放置"某些对象。当重复点击时,游戏需要创建多个实例(一个未知子类)。我想出了三个解决方案:
a) 让选择要放置的对象的菜单保持类型,并使用"反射"重复生成该类型。
b) 让菜单保存对象的实例,然后使用"反射"创建新实例。(现在可以用MemberwiseClone代替)
c) 让菜单保存对象的实例,并在放置第一个实例后使用"克隆"方法创建新实例。
我认为C是最好的,但我想知道为什么。
我正在寻找的模型答案如下(请酌情扩展、更正和完整):
"克隆"方法通常不会像您在问题中指出的那样只调用new();它将跨正在克隆的实例的部分或全部属性进行复制。浅层克隆复制有限数量的属性,而深层克隆复制所有属性。
如果您只需要创建一个特定类的新实例,最好使用Object.MemberwiseClone().
每次引用实例时都应该使用Clone方法,因为您知道该实例将具有ICloneable属性。
Activator.CreateInstance()应保留为仅在没有引用实例时使用,例如从文本文件或XXXXXXX加载类信息时。
解决创建未知类的新实例问题的方法总是尝试通过类型安全的编译时方法(例如克隆)来实现这一点,并且只在完全不可能的情况下使用反射。
利弊总结:
克隆/成员克隆
优点:编译时检查为类型安全,运行时不会使程序崩溃,运行时速度更快缺点:不能总是使用
反射
优点/缺点:与上面相反。
如果真的想要一个浅拷贝,那么您可以很好地使用Object.MemberwiseClone
并实现ICloneable
接口。
public class Model : ICloneable
{
public object Clone()
{
return MemberwiseClone();
}
}
如果你真的想的话,你可以使用反射来执行浅层复制。我认为这是有利的,因为它是自动化的,可以扩展到提供深层复制。但是,反射比Object.MemberwiseClone()慢,并且在部分信任环境中是不允许的。它最初还需要实现更多的代码。点击此处阅读更多信息。
创建类的新实例:
MyClass obj = new MyClass();
克隆实例:
MyClass clone = obj.Clone();
如果你想让你的类可克隆,你应该实现ICloneable接口:
public class MyClass : ICloneable
{
public MyClass Clone()
{
MyClass clone = new MyClass();
// Copy property values to clone-instance.
return clone;
}
}
我不明白你为什么要让Reflection参与创建新实例。