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

时间:2009-09-16 18:56:49

标签: c# .net value-type reference-type

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

bool a = false;
bool b = a;

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

非常感谢

8 个答案:

答案 0 :(得分:31)

没有。由于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 

答案 1 :(得分:12)

感谢@Reed的回答(+1)!他鼓励我使用更强大的“通用”解决方案! :)

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

答案 2 :(得分:8)

Andrey's的小扩展回答...这允许您直接将其分配到您想要的任何类型。所以:

        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
            // ...
        }

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

}

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

答案 3 :(得分:2)

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

bool a = false;

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

...

void F(ref bool x)
{
x = true;
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

所以我猜你需要传递一个bool的引用,你不能用'BoolWrapper'类包装,因为bool住在一些你不能或不想修改的地方。

可以做到!

首先声明任何bool引用的内容

/// <summary> A reference to a bool.</summary>
/// <param name="value">new value</param>
/// <returns>Value of boolean</returns>
public delegate bool BoolRef(bool? value = null);

现在你可以像这样引用myBool

    bool myBool; // A given bool that you cannot wrap or change
    private bool myBoolRef(bool? value) {
        if (value != null) {
            myBool = (bool)value;
        }
        return myBool;
    }

并像这样使用它:

    void myTestCaller() {
        foo(myBoolRef);
    }
    void foo(BoolRef b) {
        bool c = b(); // get myBool
        b(true); // set myBool to true
    }

同样的技巧适用于其他值类型,例如int

答案 6 :(得分:0)

我有一个案例,我希望一个班级改变另一个班级&#39; bool - 请注意有更好的方法来处理这种情况,但这是使用Actions的概念证明。

public class Class1 
{
    bool myBool { get; set; }
    void changeBoolFunc(bool val) { myBool = val; }
    public Class1() 
    {
        Action<bool> changeBoolAction = changeBoolFunc;
        myBool = true; 
        Console.WriteLine(myBool);    // outputs "True"
        Class2 c2 = new Class2(changeBoolAction);
        Console.WriteLine(myBool);    // outputs "False"
    }
}
public class Class2
{
    public Class2(Action<bool> boolChanger) { boolChanger(false); }
}
void Main()
{
    Class1 c1 = new Class1();
}

答案 7 :(得分:-3)

只需将标记用作Nullable<bool>bool?,然后在传递给泛型方法的结构中设置这些标记。上面的ValueWrapper<T>类基本上与Nullable<T>完全相同。