2013-08-08 6 views
4

Je m'excuse d'avoir demandé quelque chose qui est probablement trop basique pour les gens de C#. Je fais surtout mon codage en C++. Donc, si je veux écrire un constructeur d'affectation pour ma classe, comment je fais cela? J'ai ce jusqu'à présent, mais il ne semble pas compiler:Constructeur de copie 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); 
+1

Ce n'est pas possible pour une classe. C'est possible pour une structure. Toutes les classes en C++ sont effectivement des structures en C#, en ce sens que toutes les classes et structures en C++ sont des types de valeurs, et non des types de références. – Servy

+0

cela n'a aucun sens pour un type de référence ('class'). –

+0

Pouah. Quel abus d'une belle langue. Vous les gars C++ devriez avoir honte de vous pour des trucs comme ça. – Will

Répondre

8

Vous ne pouvez pas affecter la classe elle-même - un constructeur de ce formulaire copie généralement des membres de l'autre classe:

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

Cela vous donne une "copie" par la valeur des articles de votre autre classe. Si vous voulez avoir la référence partagée, vous ne pouvez pas le faire, mais vous ne seriez pas besoin d'un constructeur - l'attribution des variables fonctionne très bien pour cela:

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

Je crois comprendre qu'il voulait que le résultat de son code ci-dessus soit 'a' et' b' étant tous les deux une référence au même objet. Cela ne ferait pas ça. – Servy

+0

@Servy Je ne sais pas si c'est le cas - édité pour inclure cela aussi –

+0

@Servy: Non. Il a raison. J'ai besoin d'objets séparés. Je suppose que tout cela est très déroutant pour une personne qui a l'habitude de traiter des pointeurs et des références non implicites comme en C#. – ahmd0

1

Vous ne pouvez pas affecter this dans un type de classe . La meilleure façon est probablement créer un autre constructeur et appeler que:

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

Ce que vous essayez de faire peut être réalisé en utilisant 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(); 
    } 
} 

Consommant:

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

Ma classe comme je l'ai montré ci-dessus n'a pas la méthode 'Clone'. – ahmd0

+1

Vous avez la méthode MemberwiseClone dans chaque classe, car elle est définie dans la classe Object – PhilHdt

+0

Pouvez-vous publier un exemple de code parce que je n'arrive pas à le trouver. – ahmd0

1

est-ce pas une solution raisonnable?

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

puis de votre code

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

Oui c'est. J'espérais juste une version plus courte pour laquelle C# semble être connue. – ahmd0

+1

^^ clone ou memberwiseclone peut convenir à vos besoins, puis –

+0

Dois-je dériver ma classe d'un objet de structure pour avoir accès à cette méthode 'Clone'? – ahmd0

Questions connexes