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);
}