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)하면 |
, &
, true
와 false
정확히 올바른 방법으로 컴파일러는 호출 |
하고 &
당신이 쓸 때 ||
와 &&
.
예를 들어,이 코드를보십시오 ( 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는 방망이에서 작동하지 않습니다. 당신은 과부하해야!. 이상 함!