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 + 5
은 x <? 2
첫 번째를 수행하고 5를 더하거나 먼저 더하기를 수행 한 다음 x <? 7
.
다른 연산자를 오버로드 %
하거나 연산자 +
역할을 할 <?
수 있습니다.
재미있을 꺼야
참고 URL : https://stackoverflow.com/questions/1040114/is-it-possible-to-create-a-new-operator-in-c
'Nice programing' 카테고리의 다른 글
Django에서 데이터베이스 테이블 변경 (0) | 2020.12.08 |
---|---|
div가 맨 아래로 스크롤되는지 어떻게 확인할 수 있습니까? (0) | 2020.12.08 |
HTML을 만드는 방법 (0) | 2020.12.08 |
Python 사전의 하위 집합 가져 오기 (0) | 2020.12.08 |
Android : 현재 테마의 리소스 ID를 얻는 방법은 무엇입니까? (0) | 2020.12.08 |