Nice programing

C #에서 새 연산자를 만들 수 있습니까?

nicepro 2020. 12. 8. 20:01
반응형

C #에서 새 연산자를 만들 수 있습니까?


기존 연산자를 오버로드 할 수 있다는 것을 알고 있습니다. 새 연산자를 만들 수 있는지 알고 싶습니다. 여기 내 시나리오가 있습니다.

나는 이것을 원한다 :

var x = (y < z) ? y : z;

이와 동등하게하려면 :

var x = y <? z;

즉, 나만의 <?연산자 를 만들고 싶습니다 .


아니요, 불가능합니다. 대신 메서드를 만들어야합니다.


아니요,하지만 C #에서 일부 기존 연산자오버로드 할 수 있습니다 .

F #과 같은 일부 다른 언어에서는 다음을 사용할 수 있습니다.

let (<?) = min

다른 답변에서 말했듯이 적어도 컴파일러에 내장 된 렉서와 파서를 변경하지 않고는 새 연산자를 만들 수 없습니다. 기본적으로, 컴파일러 등 개별 문자 인식하도록 구축 <하거나 ?, 또는 같은 한 쌍 >>또는 <=조작자가 특별히 취급하는; i<5예를 들어 변수 이름이 아닌 표현식이라는 것을 알고 있습니다. 연산자를 연산자로 인식하는 것은 연산자가 실제로 수행하는 작업을 결정하는 것과는 별개의 프로세스이며 컴파일러에 훨씬 더 긴밀하게 통합되어 있으므로 후자를 사용자 지정할 수 있지만 전자는 지정할 수 없습니다.

오픈 소스 컴파일러 (예 : GCC)가있는 언어의 경우 이론적으로 컴파일러를 수정하여 새 연산자를 인식 할 수 있습니다. 하지만 그다지 쉬운 일은 아니고 모든 사람이 코드를 사용하려면 사용자 정의 컴파일러가 필요합니다.


그렇게 할 수 없을뿐만 아니라 왜 그렇게하고 싶습니까?

y와 z가 어떤 유형인지 잘 모르겠지만 숫자 값 유형 인 경우 다음을 사용할 수 있습니다.

var x = Math.Min(y, z);

개인적으로는 여전히 선호합니다.

var x = (y < z) ? y : z;

하지만 나는 약간? : 쓰레기.

좋은 코드는 간단하고 효율적일뿐만 아니라 가독성도 있습니다. 당신이 그것을 읽은 유일한 사람이더라도 언젠가 그 <?운영자 에게 돌아와서 도대체 무엇을했는지 궁금해 할 것입니다.


아니요,하지만이 대신 확장 메서드를 만들 수 있습니다.

y.MethodName(z)

아무도 언급하지 않은 것에 놀랐습니다 "order of operations".

컴파일러가 표현식을 평가할 때 올바른 순서로 연산을 수행하는 데 관심을 가져야합니다. 그래야 (1+2*3) = (2*3+1)곱셈이 항상 "level"표현식에서 덧셈 전에 발생 합니다.

및 연산자를 재정의 할 때 연산자가 수행하는 작업을 변경할 수 있지만 컴파일러가 평가하는 순서는 변경할 수 없습니다. 새 연산자를 만든 경우 다른 연산자와 비교하여 평가할 순서를 컴파일러에 알릴 방법이 없습니다. 그래서 당신이 쓴다면 당신 x <? 2 + 5x <? 2첫 번째를 수행하고 5를 더하거나 먼저 더하기를 수행 한 다음 x <? 7.


다른 연산자를 오버로드 %하거나 연산자 +역할을 할 <?수 있습니다.

재미있을 꺼야

참고 URL : https://stackoverflow.com/questions/1040114/is-it-possible-to-create-a-new-operator-in-c

반응형