널 병합은 대략 다음과 같이 변환됩니다. 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.postcode
null입니다.
(이제 C # 6.0에서 사용할 수 있지만 이전 버전에서는 사용할 수 없습니다.)
답변
?를 추가하는 것을 고려했습니다. C # 4로 전환했습니다. 그것은 “갖고있는”기능이 아니라 “갖는 것이 좋은”기능입니다. 우리는 가상의 미래 버전에 대해 다시 고려할 것이지만, 내가 당신이라면 숨을 참지 않을 것입니다. 시간이 지남에 따라 더 이상 중요하지 않을 것입니다. 🙂
답변
특별한 종류의 단락 부울 논리가있는 경우 다음을 수행 할 수 있습니다 (자바 스크립트 예제).
return x && x.y;
경우 x
null의 경우, 다음은 평가하지 않습니다 x.y
.
답변
이것을 답으로 추가하는 것이 옳다고 느꼈습니다.
C #에 그런 것이없는 이유는 병합 연산자 (참조 형식에만 유효 함)와 달리 역방향 작업이 참조 또는 값 형식 (즉 class x
, 멤버 사용)을 생성 int y
할 수 있기 때문이라고 생각합니다. 많은 상황에서 사용할 수 없습니다.
그러나 나는 그것을보고 싶지 않다고 말하는 것이 아닙니다!
이 문제에 대한 잠재적 인 해결책은 연산자가 오른쪽에있는 값 형식 식을 nullable로 자동으로 들어 올리는 것입니다. 그러나 x.y
y가 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)
. 점 표기법만큼 예쁘지는 않지만 기능적 언어라는 점을 감안할 때 스타일이 다릅니다.