将变量绑定到列表



我有一个非常简单的层次结构: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());

0

0

问题是,在第5行我正在改变b.Result的值,但我想在包含b.Result以前状态的a.Numbers列表中反映这种变化,我怎么能做到这一点?

doublevalue type,每当您传递它时,您都会创建它的副本。它不是通过引用传递的,所以当你说a.Numbers.Add(b.Result);时,你实际上是在创建b.Result的副本并传递给Add方法。

你可以阅读这篇文章,通过例子来理解这个概念。

来自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

相关内容

  • 没有找到相关文章

最新更新