C#复制构造函数

时间:2013-08-08 19:09:26

标签: c# .net constructor

我为C#伙计们提出一些可能过于基本的东西而道歉。我主要用C ++编写代码。

所以,如果我想为我的班级编写一个赋值构造函数,我该怎么做?到目前为止,我有这个,但它似乎没有编译:

public class MyClass
{
    public string s1;
    public string s2;
    public int v1;

    public MyClass()
    {
        s1 = "";
        s2 = "";
        v1 = 0;
    }

    public MyClass(MyClass s)
    {
        this = s;    //Error on this line
    }
}


MyClass a = new MyClass();
MyClass b = new MyClass(a);

4 个答案:

答案 0 :(得分:8)

您无法分配类本身 - 该表单的构造函数通常会复制其他类的成员:

public MyClass(MyClass s)
{
    this.s1 = s.s1;
    this.s2 = s.s2;
    this.v1 = s.v1;
}

它会根据您其他课程中的项目值给出“副本”。如果你想让参考共享,你不能这样做,但你不需要一个构造函数 - 分配变量可以正常工作:

var orig = new MyClass();
var referencedCopy = orig; // Just assign the reference

答案 1 :(得分:2)

使用Clone

可以实现您的目标
public class MyClass : ICloneable
{
    public string s1;
    public string s2;
    public int v1;

    public MyClass()
    {
        s1 = "";
        s2 = "";
        v1 = 0;
    }

    public Object Clone()
    {
        return this.MemberwiseClone();
    }
}

耗竭与:

MyClass a = new MyClass();
MyClass b = (MyClass)a.Clone();

答案 2 :(得分:1)

您无法在班级类型中指定this。最好的方法可能是创建另一个构造函数并调用它:

public MyClass() : this(string.Empty, string.Empty, 0) { }

public MyClass(MyClass s) : this(s.s1, s.s2, s.v1) { }

private MyClass(string s1, string s2, int v1)
{
    this.s1 = s1;
    this.s2 = s2;
    this.v1 = v1;
}

答案 3 :(得分:1)

这不是一个合理的解决方案吗?

public myClass() { 
  s1 = ""; 
  s2 = ""; 
  v1 = 0; 
}
public myClass(String _s1, String _s2, Int _v1) {
  s1 = _s1;
  s2 = _s2;
  v1 = _v1;
}

然后从你的代码

myClass a = new myClass();
myClass b = new myClass(a.s1,a.s2,a.v1);