true ve false işleçleri (C# başvurusu)
trueişleci, işlenenin kesinlikle true doğru olduğunu belirtmek için bool değerini döndürür. falseişleci, bool true işlenenin kesinlikle false olduğunu belirtmek için değerini döndürür. trueve false işleçleri birbirini tamamlayacak şekilde garanti edilemez. Başka bir ifadeyle, true hem hem false de işleci aynı işlenen için bool değeri false dönüşe sahip olabilir. Bir tür iki işleçlerden birini tanımlarsa, başka bir işleç de tanımlaması gerekir.
İpucu
Üç değerli mantığı desteklemeniz gerekirse (örneğin, üç değerli Boole türünü destekleyen veritabanlarıyla çalışıyorsanız) türünü bool? kullanın. C# & | işlenenlerle üç değerli mantığı destekleyen ve bool? işleçlerini sağlar. Daha fazla bilgi için Boole mantıksal işleçleri makalesinde Null Değer Değere Sahip Boole mantıksal işleçleri bölümüne bakın.
Mantıksal ifadeler
Tanımlı işleci olan bir tür, if , do , while , ve deyimleri ve koşullu işlecinde koşullu ifadeyi denetleyen bir sonucun true türü olabilir. ?: Daha fazla bilgi için C# dil belirtimlerinin Boole ifadeleri bölümüne bakın.
Kullanıcı tanımlı koşullu mantıksal işleçler
Tanımlı ve işleçlerine sahip bir tür, mantıksal OR işleci veya mantıksal AND işlecini belirli bir şekilde aşırı yüklese, sırasıyla koşullu mantıksal OR işleci veya koşullu mantıksal AND işleci, o türün işlenenleri true false için değerlendir | & || && olabilir. Daha fazla bilgi için C# dil belirtimlerinin Kullanıcı tanımlı koşullu mantıksal işleçler bölümüne bakın.
Örnek
Aşağıdaki örnek, hem hem de işleçlerini true tanımlayan false türü sunar. Tür ayrıca mantıksal AND işlecini, işleci aynı türe ilişkin işlenenler için de & && değerlendirecek şekilde aşırı yüklüdür.
using System;
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şlecinin kısa devre davranışına dikkat && edebilirsiniz. yöntemi GetFuelLaunchStatus döndürerek LaunchStatus.Red işlecinin sağ && işleneni değerlendirilmez. Bunun nedeni kesinlikle LaunchStatus.Red yanlıştır. Ardından mantıksal AND değerinin sonucu, sağ işlenenin değerine bağlı değildir. Örneğin çıktısı aşağıdaki gibidir:
Getting fuel launch status...
Wait!