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

Assign value of a reference property to a variable

我有一个场景,我想将值类型 bool(标有 ref 的值类型)的引用传递给另一个 class 的构造函数并想要在另一个 class 中更新它的值。像这样的东西。有没有办法保存变量的引用。 (我用 public 标记了东西,我知道 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;
    }
}

Class A 将“看到”由 class 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
    }
}

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

如果你只想要一次价值,那就只拥有一次。从一个 class 委托给另一个,从 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 成为 B return 布尔值的方法。

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

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

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 的进一步更新将覆盖对 Observer 的任何更改)。