Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将变量绑定到列表_C#_List_Class_Properties - Fatal编程技术网

C# 将变量绑定到列表

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

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

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