C# 将引用属性的值指定给变量
我有一个场景,我希望将值类型C# 将引用属性的值指定给变量,c#,ref,value-type,C#,Ref,Value Type,我有一个场景,我希望将值类型bool(值类型标记为ref)的引用传递给另一个类的构造函数,并希望在另一个类中更新其值。像这样的。是否有方法保存变量的引用。(我用public标记了东西,我知道公共变量可以从任何地方访问) 使用引用类型包装值 public class CanUpdate { public bool Value { get; set; } } 然后 类A将“查看”由类B更改的值 public class A { private CanUpdate CanUpdate
bool
(值类型标记为ref
)的引用传递给另一个类的构造函数,并希望在另一个类中更新其值。像这样的。是否有方法保存变量的引用。(我用public标记了东西,我知道公共变量可以从任何地方访问)
使用引用类型包装值
public class CanUpdate
{
public bool Value { get; set; }
}
然后
类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的方法B返回布尔值。将字段设置为引用类型(private ref bool\u val;
)是没有意义的,因为它只是一个类范围的变量。属性设置器不允许您将ref
修饰符添加到自动value
参数,因此这也不起作用。此外,不能将属性作为ref
参数传递(即obj1.Method(ref obj2.Value)
将不起作用)
我认为你试图描述的是,观察者观察受试者状态的变化并做出反应。它类似于JavaScript中的事件监听器,但不是观看操作,而是观看状态。这方面的一个简单实现可能如下所示:
公共类科目
{
私有只读观察者[]观察者;
私有字符串_val;
公共字符串Val
{
get=>\u val;
设置
{
//设置此选项后,更新每个观察者的值。
foreach(观察员中的观察员o)
{
o、 Val=值;
}
_val=值;
}
}
公共主题(参数观察员[]观察员)
{
观察员=观察员;
}
}
公共类观察员
{
公共字符串Val{get;set;}
}
//执行中:
var o1=新的观察者();
var o2=新观察者();
var受试者=新受试者(o1,o2);
subject.Val=“你好”;
控制台写入线(“o1:+o1.Val”);
控制台写入线(“o2:+o2.Val”);
Console.WriteLine(“主题:+subject.Val”);
//输出:
//o1:你好
//你好
//主题:你好
注意:这种特殊情况有一些局限性,因为这种关系只适用于从订户
到观察者
(即,如果您直接更改观察者的Val
,其他观察者将不会反映出来,对Subject的进一步更新将覆盖对观察者的任何更改).我不清楚你想做什么。当更改类别B中的字段值时,是否希望更改类别A中字段更新的值?不能在类别中存储ref
。但我一直想要的是一个盒装的bool
。这里的解决方案是通过一个包含bool的对象或一个可以就地更改它的委托。我不会说“将字段设置为ref没有意义”,ECMA-335标准只允许这样做,因为它可能会泄漏指向堆的堆栈指针。C++使用它的全部时间,但它对于托管指针来说是不安全的。我有WPF应用程序,在其中我只需要更新一个布尔属性,该属性绑定到子类的进度条。所以我不想以B=new B的形式传入整个对象(这个),我只想看看在执行子类中的操作时是否有方法传入ref参数。我也不想提起事件。我知道观察者模式。谢谢你的帮助。
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; }
}
}
public void DoSomething()
{
B b = new B(ref Update);
}