2010-01-20 8 views
3

많은 시나리오에서 연산자 오버로드를 사용하면 자신을 더 잘 표현할 수 있습니다. 왜 그들은 C#에서 거의 사용되지 않습니까?연산자 오버로드가 자주 사용되지 않는 이유는 무엇입니까?

+3

좀 더 표현력이 좋은 곳을 몇 가지 예를 들려 줄 수 있습니까? – Joe

+0

내 머리 꼭대기에서 벗어남 : XmlDocument completeXml = customers + orders; // XmlDocument를 만들고 자식 요소를 추가하는 대신. –

답변

11

대부분의 개체 클래스에 대해 수학적 연산 (대다수의 연산자가 있음)을 사용하는 것이 적절하지 않기 때문에 자주 사용되지 않습니다. 원하는 작업의 의미는 보통 어떤 방식 으로든 다릅니다. 예를 들어 실제로 집계 나 그룹화를 원할 때와 같이 OrderLine 객체에 대한 추가를 사용하지 않을 것입니다.

"+"는 부모 요소에 자식 요소를 배치하는 데 괜찮은 방법처럼 보일 수 있지만 완전히 다른 의미를 갖습니다. "+"는 수학적으로 그들을 더할 것이라는 것을 암시합니다. 사실, 당신은이 둘 사이의 계급 관계를 목표로하고 있습니다. 그것은 당신에게 의미가 있을지 모르나, 나는 처음 프로그래머가 많은 프로그래머에게 그 코드를 읽지 못할 것이라고 생각합니다.

거의 사용하지 않기 때문에 거의 사용하지 않습니다.

+0

게리에게 감사드립니다.내 XmlDocument 예제에서 의미 한 것은 둘 다 하나의 XML 컨테이너에 연결되도록하는 것이 었습니다. 더 좋은 예가있을 수 있습니다 : var completeXml = knifes + forks + spoons; –

+4

당신이 의미 한 바를 설명해야한다는 사실은 처음에는 좋은 생각이 아닐 것이라는 지표입니다. 좋은 코드는 스스로 문서화해야합니다. –

6

희소성의 또 다른 이유는 함수 오버로드가 함수의 이름을 통해 자체 문서화 될 수있는 반면 매우 자주 문맥에 따라 연산자는 일반적으로 한두 개의 문자 만 사용한다는 것입니다.

이로 인해 과부하가 정확하게 달성하기 위해 의도 된 것을 명확하게 명확히 할 수 없습니다. 예를 들어, 문자열! = 비교 연산자 오버로드는 길이를 비교하는지, 대소 문자를 구분하지 않는 비교로 문자를 수행하는지 또는 정적 색인 배열에서 값을 조회하고 비교하는지 (즉, 미숙 한 예).

0

DSL (도메인 별 언어)을 쉽게 작성하는 언어로 많이 사용됩니다.
좋은 예가 BNF의 표기법 닫기를 사용하는 PEG입니다. 여기서 연산자는 매우 자연스럽고 표현력이 좋습니다.
Lua와 Nimrod의 PEG 모듈 용 Lpeg 라이브러리는 모두이 기능을 사용하고 있습니다.

0

.Net에서 연산자 오버로드에 대한 또 다른 큰 문제는 모든 연산자에 과부하가 걸리지 않는다는 것입니다. 그래서 예. 연산자 << 또는 >>이 사용 가능합니다. 또한 많이 사용되는 C++ 클래스의 일부는 오버로드 할 수 없습니다.

그래서 대부분의 시나리오에서는 불행히도 모든 통신 수에 액세스 할 수 없으므로 의미가 없습니다. http://msdn.microsoft.com/en-us/library/a1sway8w.aspx에서

+1

C#에서 << and >> 연산자를 오버로드 할 수 있습니다. – dan04

+0

@ dan04 : 아니요. 두 목록을 비교하십시오. – Oliver

1

:

사용자 정의 형식이 < < 연산자 과부하 수 (운영자 참조); 첫 번째 피연산자의 형식은 사용자 정의 형식이어야하며 두 번째 피연산자의 형식은 int 여야합니다. 2 진 연산자가 오버로드되면 해당 대입 연산자도 암시 적으로 오버로드됩니다.

관련 문제