Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复制构造函数_C#_.net_Constructor - Fatal编程技术网

C# 复制构造函数

C# 复制构造函数,c#,.net,constructor,C#,.net,Constructor,我很抱歉问了一些对C#people来说可能太基本的问题。我主要是用C++编写代码。 所以,如果我想为我的类编写一个赋值构造函数,我该怎么做呢?到目前为止,我有这个,但它似乎没有编译: public class MyClass { public string s1; public string s2; public int v1; public MyClass() { s1 = ""; s2 = ""; v1

我很抱歉问了一些对C#people来说可能太基本的问题。我主要是用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);

您不能分配类本身-该形式的构造函数通常会复制其他类的成员:

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

不能在类类型中分配
。最好的方法可能是创建另一个构造函数并调用:

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;
}

你想做的事情可以通过使用

消费:

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

这不是一个合理的解决办法吗

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);

这对一个班级来说是不可能的。结构是可能的。C++中的所有类都是C++中的有效结构,因为C++中的所有类和结构都是值类型,而不是引用类型。对于引用类型(类< /C>),这是没有意义的。多么滥用美丽的语言啊。你们这些C++的人应该为这样的事情感到羞耻。小心!C中的对象不是值类型,如C++中的。您可以想到
MyClass a=newmyclass()更像是
共享的(新的MyClass())@dss539:是的。我是通过艰苦的方式学会的。代码< >代码>不是C++中的代码> <代码> >,仅举几个例子。我不知道为什么他们不能叫它别的东西!我的理解是,他希望上面代码的结果是
a
b
都是对同一个对象的引用。这样做不行。@Servy不确定这是否是经过编辑的包含该内容的案例too@Servy:不,他是对的。我需要分开的东西。我想,对于一个习惯于处理指针而不是像C#Servy中那样的隐含引用的人来说,这是非常令人困惑的。@Servy,“复制构造函数”复制object中包含的数据是的。我只是希望C#能有一个较短的版本。clone或memberwiseclone可能适合您的需要,那么我是否需要从某个框架对象派生类来访问该
clone
方法?每个类中都有memberwiseclone方法,因为它是在对象类中定义的。它是一个受保护的方法,您只能从类内部访问它。我已经用代码更新了我的答案。谢谢。这是一种快速的方法,尽管当我读到它时,它说它创建了一个
浅拷贝
,如果我没有弄错的话,它并不完全是我需要的。我需要每个成员对象的一个新副本。如果您只有基元属性,那么您的类memberwiseclone就足够了,但是对于完整的克隆,您需要编写一个深度克隆方法,关于这个的更多信息
myClass a = new myClass();
myClass b = new myClass(a.s1,a.s2,a.v1);