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

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 #의 거짓 연산자는 무엇에 유용할까요?

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



답변

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

&&||운영자는 재정의 할 수 없습니다,하지만 당신은 오버라이드 (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;
}

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


답변

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에 대해 계산 된 값에서 호출되어 연산 결과를 생성합니다.


답변

http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx에 링크하는 페이지 에는 nullable 값 형식이 도입되기 전에 nullable bool을 처리하는 방법이었던 용도가 나와 있습니다.

나는 요즘에는 ArrayList와 같은 종류의 물건에 좋다고 생각합니다.


답변

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

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

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

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


답변

링크 된 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는 방망이에서 작동하지 않습니다. 당신은 과부하해야!. 이상 함!


답변