Saya memerlukan sedikit kelas aneh yang membantu saya membuat predikat kompleks dan menyimpan komponen yang akan membantu saya dalam skenario lain.

Masalah saya adalah ketika saya membebani operator "&" (dan tentu saja operator benar dan salah) maka operator "&" saya tidak terpicu dalam beberapa kasus.

public class ObservablePredicate // : IObservable<bool> does not need now
{
    public ObservablePredicate Parent { get; set; }
    public IList<ObservablePredicate> Components { get; set; }

    public static bool operator true(ObservablePredicate x)
    {
        return x.Value;
    }

    public static bool operator false(ObservablePredicate x)
    {
        return !x.Value;
    }

    public static ObservablePredicate operator &(ObservablePredicate a, ObservablePredicate b)
    {
        if (a == null) a = new ObservablePredicate(false);
        if (b == null) b = new ObservablePredicate(false);

        var result = a.Value && b.Value;
        return new ObservablePredicate(result, a, b);
    }

    private bool _value;
    public bool Value
    {
        get => _value;
        set
        {
            _value = value;
            // do something with components if exists...
            // do something with parent if exists...
        }
    }

    public ObservablePredicate(ObservablePredicate p)
    {
        Initialise(p.Value, null);
    }

    public ObservablePredicate(bool value, params ObservablePredicate[] predicates)
    {
        predicates.ToList().ForEach(p => p.Parent = this);
        Initialise(value, predicates.ToList());
    }

    private void Initialise(bool value, List<ObservablePredicate> components)
    {
        Components = components ?? new List<ObservablePredicate>();
        Value = value;
    }
}

Operator "&" diaktifkan dalam situasi berikut:

var prediacteA = new ObservablePredicate(true);
var predicateB = new ObservablePredicate(true);
var predicateC = prediacteA && predicateB;
var prediacteA = new ObservablePredicate(true);
var predicateB = new ObservablePredicate(false);
var predicateC = prediacteA && predicateB;

Tetapi tidak dalam situasi berikut, dan karena itu properti Komponen saya akan kosong:

var prediacteA = new ObservablePredicate(false);
var predicateB = new ObservablePredicate(true);
var predicateC = prediacteA && predicateB;
var prediacteA = new ObservablePredicate(false);
var predicateB = new ObservablePredicate(false);
var predicateC = prediacteA && predicateB;

Bagaimana saya bisa memecahkan masalah ini?

0
Christian 23 Mei 2020, 13:45

1 menjawab

Jawaban Terbaik

Menurut ini, && operator tidak dapat kelebihan beban.

& adalah logika AND dimana && adalah operator logika kondisional yang disebut juga short-circuit, yang berarti jika kondisi pertama salah, kondisi kedua tidak akan dievaluasi.

Biasanya Anda akan selalu menggunakan && dalam pernyataan if dan predikat lainnya dan & saat bekerja pada level bit-bijaksana:

if(a && b) // where a and b is booleans

0b0101 & 0b0100 = 0b0100

3
Michael 23 Mei 2020, 11:51