IT

C #의 거짓 연산자는 무엇에 좋은가요?

lottoking 2020. 8. 8. 12:06
반응형

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)

그러나 위의 모든 예에서 참 연산자 만 실행됩니다. 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는 방망이에서 작동하지 않습니다. 당신은 과부하해야!. 이상 함!

참고 URL : https://stackoverflow.com/questions/33265/whats-the-false-operator-in-c-sharp-good-for

반응형