C#,将一个bool复制到另一个bool(通过ref,而不是val)

14 .net c# value-type reference-type

我在这里的砖墙.是否可以将一个bool复制到另一个bool的ref.考虑这段代码...

bool a = false;
bool b = a;
Run Code Online (Sandbox Code Playgroud)

b现在是一个完全独立的bool,其值为false.如果我随后更改了a,则对b没有影响.是否有可能通过ref做出a = b?我该怎么办?

非常感谢

Ree*_*sey 33

不可以.因为bool是值类型,所以它将始终按值复制.

最好的选择是将bool包装在一个类中 - 这将为它提供引用类型语义:

public class BoolWrapper
{
     public bool Value { get; set; }
     public BoolWrapper (bool value) { this.Value = value; }
}

BoolWrapper a = new BoolWrapper(false);
BoolWrapper b = a;
b.Value = true; 
 // a.Value == true 
Run Code Online (Sandbox Code Playgroud)

  • 引用类型保证被引用的对象至少与引用一样长.不提供此类保证的值类型通常存储在堆栈中,并在执行离开其声明范围后立即消失.允许一个人创建对值类型的持久和混杂引用将要求计算机在其作用域退出之前将该变量从堆栈中复制出来,将引用指向新副本; 从理论上讲,系统可以通过多种方式实现这一目标,但是只要任何变量离开范围,所有这些方法都会增加巨大的开销. (4认同)
  • 确实.虽然我不禁想知道为什么这样的事情首先是必要的...... (3认同)

And*_*zov 13

感谢@Reed的回答(+1)!他鼓励我采用更"通用"的解决方案!:)

public class ValueWrapper<T> where T : struct
{
    public T Value { get; set; }
    public ValueWrapper(T value) { this.Value = value; }
}
Run Code Online (Sandbox Code Playgroud)


Ber*_*ier 9

安德烈答案的小扩展......这允许你直接将它分配到你想要的任何类型.所以:

        ValueWrapper<bool> wrappedBool = new ValueWrapper<bool>(true);

        bool unwrapped = wrappedBool;  // you can assign it direclty:

        if (wrappedBool) { // or use it how you'd use a bool directly
            // ...
        }
Run Code Online (Sandbox Code Playgroud)

public class ValueWrapper<T>
{

    public T Value { get; set; }

    public ValueWrapper() { }

    public ValueWrapper(T value) { 
        this.Value = value; 
    }

    public static implicit operator T(ValueWrapper<T> wrapper)
    {
        if (wrapper == null) {
            return default(T);
        }
        return wrapper.Value;
    }

}
Run Code Online (Sandbox Code Playgroud)


Zac*_*ack 6

这可能不是你想要的,但如果你的场景是你想要一个你调用的函数来修改你的本地布尔值,你可以使用 ref 或 out keyworkd。

bool a = false;

F(ref a);
// a now equals true

...

void F(ref bool x)
{
x = true;
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ock 0

bool 是值类型,不能通过引用复制。