true ve false işleçleri - nesnelerinize Boole değeri olarak davranın

işleci, true işleneninin kesinlikle doğru olduğunu belirtmek için bool değerini true döndürür. işleci, false işleneninin bool kesinlikle false olduğunu belirtmek için değerini true döndürür. true ve false işleçlerinin birbirini tamamlaması garanti değildir. Diğer bir ifadeyletrue, hem hem de false işleci aynı işlenenin değerini false döndürebilirbool. Bir tür iki işleçlerden birini tanımlıyorsa, başka bir işleç de tanımlaması gerekir.

İpucu

bool? Üç değerli mantığı (örneğin, üç değerli Boole türünü destekleyen veritabanlarıyla çalışırken) desteklemeniz gerekiyorsa türünü kullanın. C# işlenenlerle &bool? üç değerli mantığı destekleyen ve | işleçlerini sağlar. Daha fazla bilgi için Boole mantıksal işleçleri makalesinin Null Atanabilir Boolemantıksal işleçleri bölümüne bakın.

Mantıksal ifadeler

tanımlı true işlecine sahip bir tür, if, do, while ve for deyimlerinde ve koşullu işlecinde ?:bir denetim koşullu ifadesinin sonucu olabilir. Daha fazla bilgi için C# dil belirtimininBoole ifadeleri bölümüne bakın.

Kullanıcı tanımlı koşullu mantıksal işleçler

Tanımlı true ve false işleçleri olan bir tür mantıksal OR işlecini veya mantıksal AND işlecini&| belirli bir şekilde aşırı yüklerse, sırasıyla koşullu mantıksal OR işleci|| veya koşullu mantıksal AND işleci&&, bu türün işlenenleri için değerlendirilebilir. Daha fazla bilgi için C# dil belirtimininKullanıcı tanımlı koşullu mantıksal işleçler bölümüne bakın.

Örnek

Aşağıdaki örnekte hem false hem de true işleçlerini tanımlayan tür verilmiştir. Türü ayrıca mantıksal AND işlecini, işlecin & bu türün && işlenenleri için de değerlendirilebileceği şekilde aşırı yükler.

public struct LaunchStatus
{
    public static readonly LaunchStatus Green = new LaunchStatus(0);
    public static readonly LaunchStatus Yellow = new LaunchStatus(1);
    public static readonly LaunchStatus Red = new LaunchStatus(2);

    private int status;

    private LaunchStatus(int status)
    {
        this.status = status;
    }

    public static bool operator true(LaunchStatus x) => x == Green || x == Yellow;
    public static bool operator false(LaunchStatus x) => x == Red;

    public static LaunchStatus operator &(LaunchStatus x, LaunchStatus y)
    {
        if (x == Red || y == Red || (x == Yellow && y == Yellow))
        {
            return Red;
        }

        if (x == Yellow || y == Yellow)
        {
            return Yellow;
        }

        return Green;
    }

    public static bool operator ==(LaunchStatus x, LaunchStatus y) => x.status == y.status;
    public static bool operator !=(LaunchStatus x, LaunchStatus y) => !(x == y);

    public override bool Equals(object obj) => obj is LaunchStatus other && this == other;
    public override int GetHashCode() => status;
}

public class LaunchStatusTest
{
    public static void Main()
    {
        LaunchStatus okToLaunch = GetFuelLaunchStatus() && GetNavigationLaunchStatus();
        Console.WriteLine(okToLaunch ? "Ready to go!" : "Wait!");
    }

    static LaunchStatus GetFuelLaunchStatus()
    {
        Console.WriteLine("Getting fuel launch status...");
        return LaunchStatus.Red;
    }

    static LaunchStatus GetNavigationLaunchStatus()
    {
        Console.WriteLine("Getting navigation launch status...");
        return LaunchStatus.Yellow;
    }
}

işlecin kısa devre davranışına && dikkat edin. yöntemi döndürdüğünde GetFuelLaunchStatusLaunchStatus.Redişlecin sağ işleneni && değerlendirilmez. Bunun nedeni LaunchStatus.Red kesinlikle yanlış olmasıdır. Ardından mantıksal AND'nin sonucu sağ işlenenin değerine bağlı değildir. Örneğin çıktısı aşağıdaki gibidir:

Getting fuel launch status...
Wait!

Ayrıca bkz.