다음을 통해 공유


true 및 false 연산자 - 개체를 부울 값으로 처리

true 연산자는 booltrue를 반환하여 피연산자가 확실히 true임을 나타내고 false 연산자는 피연산자가 확실히 false임을 나타내는 booltrue를 반환합니다.
truefalse 연산자를 모두 구현하는 형식은 다음 의미 체계를 따라야 합니다.

  • "이 개체가 true인가요?"는 연산자 true로 확인됩니다. 연산자 true는 개체가 true인 경우 true를 반환합니다. 대답은 "예, 이 개체는 true입니다"입니다.
  • "이 개체가 false인가요?"는 연산자 false로 확인됩니다. 연산자 false는 개체가 false인 경우 true를 반환합니다. 대답은 "예, 이 개체는 false입니다"입니다.

truefalse 연산자는 서로를 보완한다고 보장되지 않습니다. 즉, truefalse 연산자는 모두 bool 값을 동일한 false 피연산자에 반환할 수도 있습니다. 형식이 두 연산자 중 하나를 정의하는 경우 나머지 연산자도 정의해야 합니다.

예를 들어 값이 세 개인 논리를 지원해야 하는 경우(예: 값이 세 개인 부울 형식을 지원하는 데이터베이스에서 작업하는 경우) bool? 형식을 사용합니다. C#은 bool? 피연산자를 사용하여 값이 세 개인 논리를 지원하는 &| 연산자를 제공합니다. 자세한 내용은 부울 논리 연산자 문서의 Nullable 부울 논리 연산자 섹션을 참조하세요.

부울 식

정의된 true 연산자가 있는 형식은 if, do, whilefor 문과 조건부 연산자?:에서 제어하는 조건식의 결과 형식일 수 있습니다. 자세한 내용은 C# 언어 사양부울 식 섹션을 참조하세요.

사용자 지정 조건부 논리 연산자

정의된 truefalse 연산자가 있는 형식이 특정 방식으로 논리적 OR 연산자 | 또는 논리적 AND 연산자 &오버로드하는 경우, 조건부 논리적 OR 연산자 || 또는 조건부 논리적 AND 연산자 &&가 해당 형식의 피연산자에 대해 각각 계산될 수 있습니다. 자세한 내용은 C# 언어 사양사용자 정의 조건부 논리 연산자 섹션을 참조하세요.

예제

다음 예제는 truefalse 연산자를 둘 다 정의하는 형식을 제공합니다. && 연산자도 해당 형식의 피연산자에 대해 계산될 수 있는 방식으로 논리적 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!

참고 항목