true および false 演算子 - オブジェクトをブール値として扱います
true
演算子は、オペランドが確実に true であることを示すためにブール値の true
を返します。一方、false
演算子は、オペランドが確実に false であることを示す bool
値の true
を返します。
true
と false
演算子の両方を実装する型は、次のセマンティクスに従う必要があることに注意してください。
- "このオブジェクトは true ですか?" は演算子
true
に解決されます。 演算子true
は、オブジェクトがtrue
の場合にtrue
を返します。 答えは "はい、このオブジェクトは true です" です。 - "このオブジェクトは false ですか?" は演算子
false
に解決されます。 演算子false
は、オブジェクトがfalse
の場合にtrue
を返します。 答えは "はい、このオブジェクトは false です" です
true
および false
演算子が互いに補完することは保証されていません。 つまり、true
と false
演算子の両方が同じオペランドに対して bool
値 false
を返す場合があります。 ある型でこの 2 つの演算子の 1 つを定義する場合は、もう 1 つの演算子も定義する必要があります。
ヒント
3 値ロジックをサポートする必要がある場合は、bool?
型を使用します。たとえば、3 値ブール型をサポートするデータベースを操作する場合などです。 C# には、bool?
オペランドを使用して 3 値ロジックをサポートする &
および |
演算子があります。 詳細については、「Boolean logical operators (ブール論理演算子)」記事の「Nullable Boolean logical operators (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!
関連項目
.NET