C# 中构造函数的深层复制 [已关闭]

Deep Copy of Constructor in C# [closed]

提问人:Syed Rafay Hassni 提问时间:11/2/2022 更新时间:11/2/2022 访问量:161

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

去年关闭。

我正在尝试创建对象的深层副本,但编译器抛出此错误enter image description here

由于我是 C# 的初学者,并且想掌握 oop 的这些概念,因此非常感谢您解释此概念的宝贵答案

C# OOP 计算机科学 复制构造函数 深拷贝

评论

4赞 Andrew Truckle 11/2/2022
请不要显示代码截图。将其作为格式化代码文本包含在内。并确保你提供了一个其他人可以复制的最小示例。
0赞 Andrew Truckle 11/2/2022
这听起来很简单。二次结构不接受参数。所以你可能想要 a = b 来代替?
1赞 Damien_The_Unbeliever 11/2/2022
看起来您可能来自使用 c++ 的背景,也许?意识到不同的语言的工作方式不同,关于这些语言的工作方式没有“普遍真理”。因此,例如,默认情况下,C# 不会创建复制构造函数(通常也不需要)
0赞 oleksii 11/2/2022
在 C# 中,可以通过实现 IClonable 来实现此目的。
1赞 madreflection 11/2/2022
给出自己的输入和输出方法不是一个好的设计。这些与类型所表示的数学概念无关。它应该表示值(A、B、C),并对这些值实现操作(求解?)(如果有的话)。因此,它比 a 更好,并且制作副本(这应该足够浅)是一个简单的赋值问题,如果想要支持字符串表示,请实现 Parse/TryParse 和 ToString,但该字符串应该来自任何地方QuadraticstructclassQuadratic copy = original;

答:

1赞 Sabre 11/2/2022 #1

我们需要查看二次类的 ctor,似乎您缺少一个接受一个参数的重载。

这样。

namespace ConsoleApp1
{
    internal class Class1
    {

        public Class1()
        {

        }

        public Class1(int input)
        {

        }
    }
}
0赞 cemahseri 11/2/2022 #2

我假设您的 Quadratic 类没有自己的类型用于创建深层复制的重载。创建类的深层副本的选项很少。

  1. 通过在构造函数中自行设置类的属性来创建类
  2. 使用 MemberwiseClone() 方法。
  3. 序列化它,然后再次反序列化它。可以使用位于 System.Text.Json 命名空间中的内置 JSON 序列化程序或 Protobuf 执行此操作。(不要使用 BinaryFormatter 来执行此操作。有关详细信息,请查看文章。
public class Quadratic
{
    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }

    public Quadratic()
    {
    }

    public Quadratic(Quadratic quadraticToCopy)
    {
        A = quadraticToCopy.A;
        B = quadraticToCopy.B;
        C = quadraticToCopy.C;
    }

    public Quadratic CreateDeepCopy1() => new Quadratic(this);
    public Quadratic CreateDeepCopy2() => (Quadratic)this.MemberwiseClone();
}

然后你可以这样使用它;

var originalQuadratic = new Quadratic();
originalQuadratic.Input();
originalQuadratic.Display();

var deepCopiedQuadratic1 = originalQuadratic.CreateDeepCopy1();
var deepCopiedQuadratic2 = originalQuadratic.CreateDeepCopy2();