我想通过ref链接两个变量,这样当我更新一个变量时,其他变量也将更新

时间:2019-01-19 20:25:12

标签: c#

我想通过引用将一个变量分配给另一个变量,这样一个变量更新时,另一个变量也会更新。

我有一些变量需要根据连接的硬件正在执行的操作进行更新。我已经建立了一个对象数组,并将每个变量分配给对象数组中的索引。它是更新的对象数组,但是当发生这种情况时,我希望激发我的原始变量的属性设置器,以便可以执行某些操作。之所以使用对象数组,是因为我可以在一个循环中对其进行迭代,并且因为我的原始变量可以具有不同的类型。我在下面展示了我要尝试做的事情的过于简化的版本,希望这是有意义的。

编辑:只是要注意testVars数组中的项目正在其他地方更新,我在下面仅显示了我要做的事情的简化版本。

public partial class Form1 : Form
{
    private bool _test0 = false;
    private int _test1 = 0;

    public object[] testVars = new object[2];

    public Form1()
    {
        InitializeComponent();
    }        

    private void Form1_Load(object sender, EventArgs e)
    {
        testVars[0] = test0;
        testVars[1] = test1;
    }

    public bool test0
    {
        get
        {
            return _test0;
        }
        set
        {
            _test0 = value;
            UpdateTest0();
        }
    }

    private void UpdateTest0()
    {
        bool NewTest0 = _test0;
    }

    public int test1
    {
        get
        {
            return _test1;
        }
        set
        {
            _test1 = value;
            UpdateTest1();
        }
    }

    private void UpdateTest1()
    {
        int NewTest1 = _test1;
    }
}

我认为可能对我有用的一种解决方案是使用指针,但是由于变量声明和指针创建必须在我的应用程序的不同范围内,因此将无法工作。同样,我在论坛上阅读的所有内容都建议不要使用指针。

@ Michael Ceber,非常感谢您的及时答复。我想我理解您的意思,并相应地更新了示例代码,但仍然无法达到我的期望。我更新的代码如下

命名空间VariableLinks {     公共局部类Form1:表单     {         私人布尔_test0 = false;         private int _test1 = 0;

    public ObjectX[] testVars = new ObjectX[2];

    public Form1()
    {
        InitializeComponent();
    }        

    private void Form1_Load(object sender, EventArgs e)
    {
        testVars[0] = new ObjectX();
        testVars[0].val = test0;
        testVars[1] = new ObjectX();
        testVars[1].val = test1;
    }

    public bool test0
    {
        get
        {
            return _test0;
        }
        set
        {
            _test0 = value;
            UpdateTest0();
        }
    }

    private void UpdateTest0()
    {
        bool NewTest0 = _test0;
    }

    public int test1
    {
        get
        {
            return _test1;
        }
        set
        {
            _test1 = value;
            UpdateTest1();
        }
    }

    private void UpdateTest1()
    {
        int NewTest1 = _test1;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        testVars[0].val = true;
    }
}

public class ObjectX : object
{
    public object val = new object();
}

}

现在,当我的按钮单击事件触发并更新testVars [0] .val时,我希望test0的setter触发,但不会。我想我误会了你的意思?

1 个答案:

答案 0 :(得分:0)

如果您将对象或引用类型存储到数组中的对象,即不包含诸如int,bool等值类型的值包含这些值,那么这将有所帮助。

例如,如果您的对象“ objectx”具有名为value的属性,则objectx.value可以存储此类值。

然后您可以为该objectx设置任何您喜欢的变量,并且每当您更新objectx.value的值时,所有变量都将获取更改,因为它们都指向同一对象...

所以在您的示例中

testVars [0] = test0; testVars [1] = test1;

这将变成

testVars [0] .value = test0; testVars [1] .value = test1;

也许是为了实现这一目标

公共对象[] testVars =新对象[2];

应该成为

公共ObjectX [] testVars =新的ObjectX [2];

并将单个公共属性“值”添加到此ObjectX类...

希望如此!