我有一个非常简单的层次结构: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
列表中反映这种变化,我怎么能做到这一点?
double
是value 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