当前位置:  开发笔记 > 编程语言 > 正文

通用C#复制构造函数

如何解决《通用C#复制构造函数》经验,为你挑选了4个好方法。

为c#类编写通用复制构造函数的最佳方法是什么?它们都从一个抽象基类继承,所以我可以使用反射来映射属性,但我想知道是否有更好的方法?



1> Vordreller..:

复制构造函数基本上意味着您有一个参数,这是您要复制的对象.

另外,做一个深拷贝,而不是浅拷贝.

如果您不知道深层和浅层副本是什么,那么这是交易:

假设您正在复制一个具有单行整数的类作为字段.

浅拷贝将是:

public class Myclass()
{
    private int[] row;
    public MyClass(MyClass class)
    {
        this.row = class.row
    }
}

深拷贝是:

public class Myclass()
{
    private int[] row;
    public MyClass(MyClass class)
    {
        for(int i = 0; i

深拷贝确实获取了实际值并将它们放在新对象的新字段中,而浅拷贝只复制指针.

使用浅拷贝,如果你设置:

row[3] = 5;

然后打印两行,两个打印将有5作为第四个数字的值.但是,使用深层复制时,只有第一个打印才会有这个,因为行没有相同的指针.


由于`row`从未被初始化,上述代码是否会失败?

2> Øyvind Skaar..:

如果可以的话,避免反思.每个类都应该负责复制自己的属性,并将其进一步发送到基本方法.


这并不难读,而且编写起来肯定很容易,但是需要考虑维护问题.如果向类添加新属性,则需要更新复制构造函数和测试,这很容易忘记.

3> Marc Gravell..:

您可以通过预编译来有效地创建浅层副本,例如使用Expression.例如,像这样.

对于深层拷贝,序列化是最可靠的方法.



4> B2K..:

这是我正在使用的构造函数.请注意,由于我的基类的性质,这是一个浅构造函数,而且相当简单.应该足够好,让你开始.

public partial class LocationView : Location
{
    public LocationView() {}

    // base class copy constructor
    public LocationView(Location value) {
        Type t = typeof(Location);
        PropertyInfo[] properties = t.GetProperties();
        foreach (PropertyInfo pi in properties)
        {
            pi.SetValue(this, pi.GetValue(value, null), null);
        }
    }
    public Quote Quote { get; set; }
}


@ChrisMarisic我倾向于在牺牲阅读能力时避免使用单行.
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有