5

我很抱歉问了一些对 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

4 回答 4

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
于 2013-08-08T19:12:50.203 回答
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();
于 2013-08-08T19:13:48.120 回答
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;
}
于 2013-08-08T19:13:38.950 回答
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);
于 2013-08-08T19:19:56.460 回答