将引用属性的值分配给变量

问题描述

我有一个场景,我想将值类型 bool(用 ref 标记的值类型)的引用传递给另一个类的构造函数,并希望在其他班级。像这样的东西。有没有办法保存变量的引用。 (我用public标记了东西,我知道可以从任何地方访问公共变量)

public class A
{
    public bool Update;
    public void DoSomething()
    {
        B b = new B(ref Update);
    }
}

public class B
{
    private ref bool _val; //Is it possible to create a variable like this. If not is there a way to achieve what I am doing.
    public B(ref bool value)
    {
        _val = value;
    }
    private void UpdateValue()
    {
        _val = true;
    }
}

解决方法

用引用类型包装值

public class CanUpdate
{
    public bool Value { get; set; }
}

然后

public class B
{
    private readonly CanUpdate _canUpdate;

    public B(CanUpdate value)
    {
        _canUpdate = value;
    }

    private void UpdateValue()
    {
        _canUpdate.Value = true;
    }
}

A 将“看到”类 B 更改的值

public class A
{
    private CanUpdate CanUpdate;

    public A()
    {
        CanUpdate = new CanUpdate { Value = false };
    }

    public void DoSomething()
    {
        Console.WriteLine(CanUpdate.Value); // false

        var b = new B(CanUpdate);
        b.UpdateValue();

        Console.WriteLine(CanUpdate.Value); // true
    }
}

为值拥有自己的专用类型可提高可读性并使其他人更容易理解代码。

,

如果您只想要该值一次,那么只需拥有一次。从一个班级委派到另一个班级,从 A 到 B,反之亦然。

public class A
{
    B b = new B(false);
    public bool Update { 
        get { return b.BooleanValue; }
    }

    public void DoSomething()
    {

    }
}

public class B
{
    public B(bool value)
    {
        _val = value;
    }
    private void UpdateValue()
    {
        _val = true;
    }

    public bool BooleanValue{ 
        get { return _val; }
    }
}

如果B的使用真的像临时一样

public void DoSomething()
{
    B b = new B(ref Update);
}

然后让 B 的一个方法返回布尔值。

,

将字段设置为引用类型 (private ref bool _val;) 没有意义,因为它只是一个类作用域变量。属性设置器不允许您将 ref 修饰符添加到自动 value 参数,因此这也不起作用。此外,您不能将属性作为 ref 参数传递(即 obj1.Method(ref obj2.Value) 不起作用)。

我认为您要描述的是observer pattern,其中观察者观察对象状态的变化并做出反应。它类似于 JavaScript 中的事件侦听器,但您不是在观察 动作,而是在观察 状态。一个简单的实现可能如下所示:

public class Subject
{
    private readonly Observer[] Observers;
    private string _val;
    public string Val
    {
        get => _val;
        set
        {
            // Update every observer's value when this is set.
            foreach (Observer o in Observers)
            {
                o.Val = value;
            }
            _val = value;
        }
    }
    public Subject(params Observer[] observers)
    {
        Observers = observers;
    }
}

public class Observer
{
    public string Val { get; set; }
}

// In execution:
var o1 = new Observer();
var o2 = new Observer();
var subject = new Subject(o1,o2);
subject.Val = "hello there";
Console.WriteLine("o1: " + o1.Val);
Console.WriteLine("o2: " + o2.Val);
Console.WriteLine("subject: " + subject.Val);

// Output:
// o1: hello there
// o2: hello there
// subject: hello there

注意这个特殊情况有一些限制,因为关系只适用于从 SubscriberObserver(即,如果你直接改变观察者的 Val,它不会被反映在其他观察者和对 Subject 的进一步更新将覆盖对观察者的任何更改)。