2016-06-25 62 views
2

我有一個非常簡單的層次結構:由幾類繼承1個接口,尋找與此類似,但缺少一些屬性:綁定變量列出

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

這裏是我想要一個示例代碼來實現:

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

輸出

的問題是,在第5行,我改變b.Result的價值,但我想,以反映其中包含b.Result以前的狀態的a.Numbers列表這種變化,我該怎麼辦呢?

+0

'公開名單號{得到;組; } =新列表();'我很好奇這條線是幹什麼的。在我這邊,它不能編譯,因爲這條線。 – vivek

+0

@vivek它在C#6中編譯。這是一個名爲** Property Initialization **的新特性。查看C#6的功能:https://msdn.microsoft.com/en-us/magazine/dn802602.aspx – user3185569

+0

@ user3185569謝謝,我對此沒有意識到。將盡快在C#6.0上工作。 – vivek

回答

3

doublevalue type,無論何時您傳遞它,您都會創建它的副本。它不是通過引用傳遞的,所以當你說a.Numbers.Add(b.Result);時,你實際上是在創建一個b.Result的副本並傳遞給Add方法。

你可以通過例子閱讀這個Article來理解這個概念。

從C#規格:

⦁類型和變量

有兩種類型在C#:值類型 和引用類型。值類型的變量直接包含它們的數據,而引用類型的變量存儲對它們的 數據的引用,後者被稱爲對象。對於參考類型,它是 可能是兩個變量引用相同的對象,因此 可能對一個變量的操作影響另一個變量引用的對象 。對於值類型,每個變量 都有其自己的數據副本,並且一個上的操作 不可能影響另一個(除了在ref和out參數變量的情況下)。

這裏是一個解決辦法,不推薦也無妨:

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

用法:

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

打印:

0 
50