C #, копировать один bool в другой - PullRequest
13 голосов
/ 16 сентября 2009

Я здесь, у кирпичной стены. Можно ли скопировать один bool на ссылку другого. Рассмотрим этот код. , .

bool a = false;
bool b = a;

b теперь является совершенно отдельным bool со значением false. Если я впоследствии изменю a, это не повлияет на b. Можно ли сделать a = b по ссылке? Как бы я это сделал?

Большое спасибо

Ответы [ 8 ]

31 голосов
/ 16 сентября 2009

Нет. Поскольку 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 
12 голосов
/ 24 апреля 2012

Спасибо @Reed за его ответ (+1)! Он призвал меня к более «универсальному» решению! :)

public class ValueWrapper<T> where T : struct
{
    public T Value { get; set; }
    public ValueWrapper(T value) { this.Value = value; }
}
8 голосов
/ 25 марта 2015

Небольшое расширение для ответа Андрея ... это позволяет вам напрямую назначить его любому типу, который вы хотите в конце Итак:

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

</p> <pre><code>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; } }

2 голосов
/ 16 сентября 2009

это может быть не то, что вам нужно, но если ваш сценарий таков, что вы хотите, чтобы функция, которую вы вызывали для изменения вашего локального логического значения, вы можете использовать ref или out keyworkd.

bool a = false;

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

...

void F(ref bool x)
{
x = true;
}
0 голосов
/ 29 ноября 2014

У меня был случай, когда я хотел, чтобы один класс изменил 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();
}
0 голосов
/ 23 августа 2013

Так что я предполагаю, что вам нужно передать ссылку на 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

0 голосов
/ 17 сентября 2012

Просто используйте флаги как Nullable<bool> или bool? и установите их в структуре, которая передается универсальному методу. Класс ValueWrapper<T>, приведенный выше, по сути именно то, что делает Nullable<T>.

0 голосов
/ 16 сентября 2009

bool является типом значения и не может быть скопирован по ссылке.

...