C #의 거짓 연산자는 무엇에 유용합니까?


107

C #에는 두 가지 이상한 연산자가 있습니다.

이 권한을 이해하면 부울 식 대신 사용하려는 유형과 bool에 대한 암시 적 변환을 제공하지 않으려는 유형에서 이러한 연산자를 사용할 수 있습니다.

다음과 같은 수업이 있다고 가정 해 보겠습니다.

    public class MyType
    {
        public readonly int Value;

        public MyType(int value)
        {
            Value = value;
        }

        public static bool operator true (MyType mt)
        {
            return  mt.Value > 0;
        }

        public static bool operator false (MyType mt)
        {
            return  mt.Value < 0;
        }

    }

따라서 다음 코드를 작성할 수 있습니다.

    MyType mTrue = new MyType(100);
    MyType mFalse = new MyType(-100);
    MyType mDontKnow = new MyType(0);

    if (mTrue)
    {
         // Do something.
    }

    while (mFalse)
    {
        // Do something else.
    }

    do
    {
        // Another code comes here.
    } while (mDontKnow)

그러나 위의 모든 예에서 true 연산자 만 실행됩니다. 그렇다면 C #의 거짓 연산자는 무엇에 유용할까요?

참고 : 여기 , 여기여기 에서 더 많은 예를 찾을 수 있습니다 .


최신 문서는 docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 에서 찾을 수 있습니다 . 문서는 C # 2.0이 nullable 형식을 추가했기 때문에이 연산자를 더 이상 정의 할 이유가 없다고 제안합니다.
Mark Amery

답변:


65

이를 사용하여 &&||연산자 를 재정의 할 수 있습니다 .

&&||운영자는 재정의 할 수 없습니다,하지만 당신은 오버라이드 (override)하면 |, &, truefalse정확히 올바른 방법으로 컴파일러는 호출 |하고 &당신이 쓸 때 ||&&.

예를 들어,이 코드를보십시오 ( http://ayende.com/blog/1574/nhibernate-criteria-api-operator-overloading- 내가이 트릭에 대해 알아 낸 곳, @BiggsTRC에 의해 보관 된 버전 ) :

public static AbstractCriterion operator &(AbstractCriterion lhs, AbstractCriterion rhs)
{
       return new AndExpression(lhs, rhs);
}

public static AbstractCriterion operator |(AbstractCriterion lhs, AbstractCriterion rhs)
{
       return new OrExpression(lhs, rhs);
}

public static bool operator false(AbstractCriterion criteria)
{
       return false;
}
public static bool operator true(AbstractCriterion criteria)
{
       return false;
}

이것은 분명히 부작용이며 의도 된 방식이 아니지만 유용합니다.


귀하의 링크는 404입니다.이 항목을 어떻게 편집 할 것인지 확실하지 않으므로 그대로 두었습니다.
user7116

여전히 읽을 수 있도록 보관 된 사본으로 URL을 업데이트했습니다.
IAmTimCorey 2011-06-26

25

Shog9 및 Nir : 답변 해 주셔서 감사합니다. 그 대답은 나를 Steve Eichert 기사로 이끌었고 msdn을 가리 켰습니다 .

x && y 연산은 T.false (x)? x : T. & (x, y), 여기서 T.false (x)는 T에서 선언 된 false 연산자의 호출이고 T. & (x, y)는 선택된 연산자 &의 호출입니다. 즉, x가 먼저 평가되고 결과에 대해 연산자 false가 호출되어 x가 확실히 거짓인지 확인합니다. 그런 다음 x가 확실히 거짓이면 연산 결과는 이전에 x에 대해 계산 된 값입니다. 그렇지 않으면 y가 평가되고 선택된 연산자 &가 x에 대해 이전에 계산 된 값과 y에 대해 계산 된 값에서 호출되어 연산 결과를 생성합니다.


(!T.true(x)) ? x : T.&(x, y)대신 논리 를 사용하지 않았는지 궁금 합니다.
Des Nerger


7

AFAIK, &&오퍼레이터가 작동 할 때와 같은 거짓 테스트에 사용됩니다 . && 단락을 기억하십시오.

if ( mFalse && mTrue) 
{
   // ... something
}

mFalse.false()이 호출되고 반환시 true표현식은 'mFalse.true ()'에 대한 호출로 축소됩니다 (그런 다음을 반환해야합니다 false.

&표현식을 컴파일하려면 연산자를 구현해야 mFalse.false()합니다 false.


3

링크 된 MSDN 문서에서 Nullable (예 : int ?, bool? 등) 유형이 C # 2의 언어에 도입되기 전에 nullable 부울 유형을 허용하도록 제공되었습니다. 따라서 값이 참인지 거짓인지 또는 null인지를 나타내는 내부 값을 저장합니다. 즉, 예에서 true의 경우> 0, false의 경우 <0, null의 경우 == 0이면 SQL 스타일의 null 의미 체계를 얻을 수 있습니다. nullity를 명시 적으로 확인할 수 있도록 .IsNull 메서드 또는 속성을 구현해야합니다.

SQL과 비교하여 Foo 값이 true로 설정된 행 3 개, Foo 값이 false로 설정된 행 3 개, Foo 값이 null로 설정된 행 3 개가있는 테이블 테이블을 상상해보십시오.

SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE
6

모든 행을 계산하려면 다음을 수행해야합니다.

SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE OR Foo IS NULL
9

이 'IS NULL'구문은 클래스에서 .IsNull ()과 동등한 코드를 갖습니다.

LINQ는 C #과의 비교를 더욱 명확하게합니다.

int totalCount = (from s in MyTypeEnumerable
                 where s || !s
                 select s).Count();

MyTypeEnumberable이 데이터베이스의 정확히 동일한 내용을 가지고 있다고 상상해보십시오. 즉, 3 개의 값은 true, 3 개의 값은 false, 3 개의 값은 null입니다. 이 경우 totalCount는이 경우 6으로 평가됩니다. 그러나 코드를 다음과 같이 다시 작성하면

int totalCount = (from s in MyTypeEnumerable
                 where s || !s || s.IsNull()
                 select s).Count();

그러면 totalCount는 9로 평가됩니다.

거짓 연산자에 대한 링크 된 MSDN 기사에 제공된 DBNull 예제는이 정확한 동작을 가진 BCL의 클래스를 보여줍니다.

결론적으로 이러한 유형의 동작을 원하는지 완전히 확신하지 않는 한 이것을 사용해서는 안됩니다. 훨씬 단순한 nullable 구문을 사용하는 것이 좋습니다 !!

업데이트 : 방금 논리 연산자를 수동으로 재정의해야한다는 것을 알았습니다!, || 및 &&를 사용하여 제대로 작동하도록합니다. 나는 거짓 연산자가 이러한 논리 연산자에 들어간다고 믿습니다. 다른 주석에서 언급했듯이! x는 방망이에서 작동하지 않습니다. 당신은 과부하해야!. 이상 함!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.