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 true
false
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 isetrue
döndürürtrue
. Yanıt "Evet, bu nesne doğrudur" şeklindedir. - "Bu nesne yanlış mı?" işlecine
false
çözümleniyor. İşleçfalse
, nesne isefalse
dö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 true
false
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 GetFuelLaunchStatus
LaunchStatus.Red
iş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!