C# 复制构造函数
我很抱歉问了一些对C#people来说可能太基本的问题。我主要是用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
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++中的所有类和结构都是值类型,而不是引用类型。对于引用类型(
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);