true ve false işleçleri - nesnelerinizi Boole değeri olarak değerlendirin

true işleci, işleneninin kesinlikle doğru olduğunu belirtmek için bool değerini true döndürürken false işleç, işleneninin bool kesinlikle false olduğunu belirtmek için değeri true döndürür.
Hem hem de truefalse işleçlerini uygulayan bir türün şu semantiği izlemesi gerekmektedir:

  • "Bu nesne doğru mu?" işlecine trueçözümleniyor. İşleçtrue, nesne ise truedöndürürtrue. Yanıt "Evet, bu nesne doğrudur" şeklindedir.
  • "Bu nesne yanlış mı?" işlecine falseçözümleniyor. İşleçfalse, nesne ise falsedöndürürtrue. "Evet, bu nesne yanlış" yanıtı verilir

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 bu iki işleçlerden birini tanımlarsa, diğer işleci de tanımlaması gerekir.

İpucu

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

Mantıksal ifadeler

Tanımlı true işleci olan bir tür, if, do, while ve for deyimlerinde ve koşullu işlecinde ?:koşullu ifadeyi denetlemenin sonucu olabilir. Daha fazla bilgi için C# dil belirtiminin Boole 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 belirtiminin Kullanıcı tanımlı koşullu mantıksal işleçler bölümüne bakın.

Örnek

Aşağıdaki örnekte hem hem de truefalse işleçlerini tanımlayan tür verilmiştir. Türü ayrıca mantıksal AND işlecini, işlecin & bu türdeki && işlenenler 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;
    }
}

operatörün 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.