2016-06-25 8 views
2

Ich habe eine wirklich einfache Hierarchie: 1-Schnittstelle von einigen Klassen geerbt, sucht ähnlich wie diese aber fehlen einige Eigenschaften:Bind Variable zur Liste

public interface Test 
{ 
    List<double> Numbers { get; set; } 
    double Result { get; set; } 
} 

public class A : Test 
{ 
    public List<double> Numbers { get; set; } = new List<double>(); 
    public double Result { get; set; } 
} 

public class B : Test 
{ 
    public List<double> Numbers { get; set; } = new List<double>(); 
    public double Result { get; set; } 
} 

Hier ist ein Beispielcode von dem, was ich versuche, zu erreichen:

 A a = new A(); 
     B b = new B(); 
     a.Numbers.Add(b.Result); 
     Console.WriteLine(a.Numbers.Last()); 
     b.Result = 50; 
     Console.WriteLine(a.Numbers.Last()); 

Ausgabe

Das Problem ist in Zeile 5, dass ich den Wert von b.Result bin zu ändern, aber ich möchte in der a.Numbers Liste um diese Änderung widerzuspiegeln, die den bisherigen Stand der b.Result enthält, wie kann ich das tun?

+0

'public List Zahlen {get ; einstellen; } = new List (); 'Ich bin gespannt was diese Zeile macht. An meiner Seite kompiliert es aufgrund dieser Zeile nicht. – vivek

+0

@vivek kompiliert es in C# 6. Dies ist eine neue Funktion namens ** Eigenschaftsinitialisierung **. Schauen Sie sich die Funktionen von C# 6 an: https://msdn.microsoft.com/en-us/magazine/dn802602.aspx – user3185569

+0

@ user3185569 Danke, ich war darüber unwissend.Wird bald auf C# 6.0 arbeiten. – vivek

Antwort

3

double ist ein value type, wenn Sie es weitergeben, erstellen Sie eine Kopie davon. Es wird nicht als Referenz übergeben. Wenn Sie also a.Numbers.Add(b.Result); sagen, erstellen Sie tatsächlich eine Kopie von b.Result und übergeben die Methode Add.

Sie können dieses Article lesen, um dieses Konzept mit Beispielen zu verstehen.

Von C# Spezifikationen:

⦁ Typen und Variablen

Es gibt zwei Arten von Typen in C#: Werttypen und Referenztypen. Variablen von Wertetypen enthalten direkt ihre Daten, während Variablen von Referenztypen Referenzen auf ihre Daten speichern, die als Objekte bekannt sind. Bei Referenztypen ist es möglich, dass zwei Variablen auf dasselbe Objekt verweisen und somit möglich sind, damit Operationen an einer Variablen das Objekt beeinflussen, das von der anderen Variablen referenziert wird. Bei Werttypen haben die Variablen jeweils eine eigene Kopie der Daten und es ist nicht möglich, dass sich die Operationen auf die andere auswirken (außer im Fall von Ref und Out Parametervariablen).

Hier ist eine Abhilfe, wird es sowieso nicht zu empfehlen:

public interface Test 
{ 
    List<DoubleByRef> Numbers { get; set; } 
    DoubleByRef Result { get; set; } 
} 

public class A : Test 
{ 
    public List<DoubleByRef> Numbers { get; set; } = new List<DoubleByRef>(); 
    public DoubleByRef Result { get; set; } = new DoubleByRef(0); 
} 

public class B : Test 
{ 
    public List<DoubleByRef> Numbers { get; set; } = new List<DoubleByRef>(); 
    public DoubleByRef Result { get; set; } = new DoubleByRef(0); 
} 

public class DoubleByRef 
{ 
    public double Value { set; get; } 
    public DoubleByRef(double d) 
    { 
     Value = d; 
    } 

    public override string ToString() 
    { 
     return Value.ToString(); 
    } 
} 

Verbrauch:

A a = new A(); 
B b = new B(); 
a.Numbers.Add(b.Result); 
Console.WriteLine(a.Numbers.Last()); 
b.Result.Value = 50; 
Console.WriteLine(a.Numbers.Last()); 

Drucke:

0 
50