true 和 false 運算子:將物件視為布林值
true
運算子會傳回 bool 值 true
,表示其運算元肯定為 true,而 false
運算子會傳回 bool
值 true
,表示其運算元肯定為 false。
請注意,實作 true
和 false
運算子的型別必須遵循下列語意:
- "Is this object true?" 解析為運算子
true
。 如果物件是true
,運算子true
會傳回true
。 答案為 "Yes, this object is true"。 - “this object false?” 解析為運算子
false
。 如果物件是false
,運算子false
會傳回true
。 答案為 "Yes, this object is false"。
true
和 false
運算子不保證會彼此互補。 也就是說,true
和 false
運算子可能會針對相同的運算元傳回 bool
值 false
。 如果某個型別定義這兩個運算子之一,也必須定義另一個運算子。
提示
如果您需要支援三值邏輯 (例如,當您處理支援三值布林值型別的資料庫時),請使用 bool?
型別。 C# 能提供搭配 bool?
運算元來支援三值邏輯的 &
和 |
運算子。 如需詳細資訊,請參閱布林值邏輯運算子一文的可為 Null 的布林值邏輯運算子一節。
布林運算式
具有已定義 true
運算子的型別可以是 if、do、while 及 for 陳述式,以及條件運算子 ?:
中之控制條件運算式的結果型別。 如需詳細資訊,請參閱 C# 語言規格的布林運算式一節。
使用者定義條件式邏輯運算子
如果具有已定義 true
和 false
運算子的型別以某種方式多載邏輯 OR 運算子 |
或邏輯 AND 運算子 &
,系統可以針對該型別的運算元分別評估條件邏輯 OR 運算子 ||
或條件邏輯 AND 運算子 &&
。 如需詳細資訊,請參閱 C# 語言規格的使用者定義條件式邏輯運算子一節。
範例
下列範例顯示同時定義了 true
和 false
運算子的型別。 該型別也多載邏輯 AND 運算子 &
,使得系統也能針對該型別的運算元評估 &&
運算子。
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;
}
}
請注意 &&
運算子的最少運算行為。 當 GetFuelLaunchStatus
方法傳回 LaunchStatus.Red
時,系統並不會評估 &&
運算子的右邊運算元。 這是因為 LaunchStatus.Red
必然為 false。 然後邏輯 AND 的結果並不取決於右邊運算元的值。 此範例的輸出如下:
Getting fuel launch status...
Wait!