【问题标题】:Bind variable to list将变量绑定到列表
【发布时间】:2016-10-28 01:13:54
【问题描述】:

我有一个非常简单的层次结构: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 列表中反映此更改,我该怎么做?

【问题讨论】:

  • public List&lt;DoubleByRef&gt; Numbers { get; set; } = new List&lt;DoubleByRef&gt;(); 我很好奇这条线的作用。在我这边,由于这一行,它无法编译。
  • @vivek 它确实在 C# 6 中编译。这是一个名为 Property Initialization 的新功能。查看 C# 6 的特性:msdn.microsoft.com/en-us/magazine/dn802602.aspx
  • @user3185569 谢谢,我不知道这一点。很快就会在 c#6.0 上工作。

标签: c# list class properties


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2013-12-29
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多