[c#] 널 병합 연산자에 “반대”가 있습니까? (… 어떤 언어로?)

널 병합은 대략 다음과 같이 변환됩니다. return x, unless it is null, in which case return y

나는 종종 필요 return null if x is null, otherwise return x.y

나는 사용할 수있다 return x == null ? null : x.y;

나쁘지는 않지만 null중간에있는 것이 항상 나를 괴롭 힙니다. 불필요한 것 같습니다. return x :: x.y;다음과 같은 것을 선호합니다. 다음에 오는 ::것이 앞에 오는 것이 아닌 경우에만 평가됩니다 null.

I는 다음과 같이 볼이 거의 간결한 인라인 널 검사와의 혼합의 종류, 널 합체에 반대하지만 [요 C에서 # 이러한 조작이 없다고 특정한.

그러한 연산자가있는 다른 언어가 있습니까? 그렇다면 무엇이라고 부릅니까?

(저는 C #으로 메서드를 작성할 수 있다는 것을 알고 있습니다. 저는를 사용 return NullOrValue.of(x, () => x.y);하지만 더 좋은 것이 있다면 저도보고 싶습니다.)



답변

Groovy 에는 null-safe 역 참조 연산자 (?.)가 있습니다. 그게 당신이 추구하는 것 같아요.

( 안전 탐색 연산자 라고도합니다 .)

예를 들면 :

homePostcode = person?.homeAddress?.postcode

는 null을 경우 줄 것이다 person, person.homeAddress또는 person.homeAddress.postcodenull입니다.

(이제 C # 6.0에서 사용할 수 있지만 이전 버전에서는 사용할 수 없습니다.)


답변

?를 추가하는 것을 고려했습니다. C # 4로 전환했습니다. 그것은 “갖고있는”기능이 아니라 “갖는 것이 좋은”기능입니다. 우리는 가상의 미래 버전에 대해 다시 고려할 것이지만, 내가 당신이라면 숨을 참지 않을 것입니다. 시간이 지남에 따라 더 이상 중요하지 않을 것입니다. 🙂


답변

특별한 종류의 단락 부울 논리가있는 경우 다음을 수행 할 수 있습니다 (자바 스크립트 예제).

return x && x.y;

경우 xnull의 경우, 다음은 평가하지 않습니다 x.y.


답변

이것을 답으로 추가하는 것이 옳다고 느꼈습니다.

C #에 그런 것이없는 이유는 병합 연산자 (참조 형식에만 유효 함)와 달리 역방향 작업이 참조 또는 값 형식 (즉 class x, 멤버 사용)을 생성 int y할 수 있기 때문이라고 생각합니다. 많은 상황에서 사용할 수 없습니다.

그러나 나는 그것을보고 싶지 않다고 말하는 것이 아닙니다!

이 문제에 대한 잠재적 인 해결책은 연산자가 오른쪽에있는 값 형식 식을 nullable로 자동으로 들어 올리는 것입니다. 그러나 x.yy가 int 인 경우 실제로 int?는 고통스러운 an 을 반환 한다는 문제 가 있습니다.

아마도 더 나은 또 다른 해결책은 연산자가 왼쪽의 표현식이 null 인 경우 오른쪽의 유형에 대한 기본값 (즉, null 또는 0)을 반환하는 것입니다. 그러나 0 / null을 실제로 읽은 시나리오 x.y또는 안전 액세스 연산자가 제공했는지 여부를 구분하는 데 문제가 있습니다 .


답변

Delphi에는 null-safe 인 : (.이 아닌) 연산자가 있습니다.

그들은?를 추가하는 것에 대해 생각하고있었습니다. 연산자를 C # 4.0으로 전환하여 동일한 작업을 수행했지만 그에 따른 블록이 있습니다.

그 동안 가려운 스크래치가있는 IfNotNull () 이 있습니다. 확실히?보다 큽니다. 또는 : 그러나 멤버 중 하나가 null 인 경우 NullReferenceException을 발생시키지 않는 일련의 작업을 구성 할 수 있습니다.


답변

Haskell에서는 >>연산자를 사용할 수 있습니다 .

  • Nothing >> Nothing 이다 Nothing
  • Nothing >> Just 1 이다 Nothing
  • Just 2 >> Nothing 이다 Nothing
  • Just 2 >> Just 1 이다 Just 1


답변

Haskell fmap은이 경우에 Data.Maybe.map. Haskell은 순전히 기능적이므로 찾고있는 것은

fmap select_y x

경우 x이며 Nothing,이 돌아갑니다 Nothing. 경우 x이며 Just object,이 돌아갑니다 Just (select_y object). 점 표기법만큼 예쁘지는 않지만 기능적 언어라는 점을 감안할 때 스타일이 다릅니다.