将引用 属性 的值分配给变量
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
请注意,这种特殊情况有一些限制,因为该关系仅适用于 Subscriber
到 Observer
(即,如果您直接更改观察者的 Val
,则不会反映出来由其他观察者和对 Subject 的进一步更新将覆盖对 Observer 的任何更改)。
我有一个场景,我想将值类型 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
请注意,这种特殊情况有一些限制,因为该关系仅适用于 Subscriber
到 Observer
(即,如果您直接更改观察者的 Val
,则不会反映出来由其他观察者和对 Subject 的进一步更新将覆盖对 Observer 的任何更改)。