C# 将变量绑定到列表
我有一个非常简单的层次结构:1接口由几个类继承,看起来与此类似,但缺少一些属性:C# 将变量绑定到列表,c#,list,class,properties,C#,List,Class,Properties,我有一个非常简单的层次结构: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 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; }
}
输出
0
0
问题是,在第5行,我正在更改
b.Result
的值,但我想在a.Numbers
列表中反映这一更改,该列表包含b.Result
的先前状态,我如何才能做到这一点?double
是一种值类型,每当您传递它时,您都会创建它的副本。它不是通过引用传递的,所以当你说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();
}
}
印刷品:
0
50
公共列表编号{get;set;}=new List()代码>我很好奇这行是做什么的。在我这边,由于这一行,它没有编译。@vivek它是用C#6编译的。这是一个称为属性初始化的新功能。查看C#6的功能:@user3185569谢谢,我对此并不担心。将很快在c#6.0上工作。
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