问题描述
我有一个场景,我想将值类型 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
注意这个特殊情况有一些限制,因为关系只适用于从 Subscriber
到 Observer
(即,如果你直接改变观察者的 Val
,它不会被反映在其他观察者和对 Subject 的进一步更新将覆盖对观察者的任何更改)。