널 병합 연산자에 "반대"가 있습니까? (… 어떤 언어로?)
널 병합은 대략 다음과 같이 변환됩니다. 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이 아닌 : (.이 아닌) 연산자가 있습니다.
그들은?를 추가하는 것에 대해 생각하고있었습니다. 연산자를 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)
. 점 표기법만큼 예쁘지는 않지만 기능적 언어라는 점을 감안할 때 스타일이 다릅니다.
PowerShell을 사용하면 null 참조에 대한 속성 (메서드 호출 아님)을 참조 할 수 있으며 인스턴스가 null 인 경우 null을 반환합니다. 이 작업은 어느 깊이에서나 할 수 있습니다. C # 4의 동적 기능이이를 지원하기를 바랐지만 지원하지 않습니다.
$x = $null
$result = $x.y # $result is null
$x = New-Object PSObject
$x | Add-Member NoteProperty y 'test'
$result = $x.y # $result is 'test'
예쁘지는 않지만 설명하는 방식으로 작동하는 확장 메서드를 추가 할 수 있습니다.
public static TResult SafeGet<T, TResult>(this T obj, Func<T, TResult> selector) {
if (obj == null) { return default(TResult); }
else { return selector(obj); }
}
var myClass = new MyClass();
var result = myClass.SafeGet(x=>x.SomeProp);
public class ok<T> {
T s;
public static implicit operator ok<T>(T s) { return new ok<T> { s = s }; }
public static implicit operator T(ok<T> _) { return _.s; }
public static bool operator true(ok<T> _) { return _.s != null; }
public static bool operator false(ok<T> _) { return _.s == null; }
public static ok<T> operator &(ok<T> x, ok<T> y) { return y; }
}
나는 종종 문자열에 대해 다음 논리가 필요합니다.
using ok = ok<string>;
...
string bob = null;
string joe = "joe";
string name = (ok)bob && bob.ToUpper(); // name == null, no error thrown
string boss = (ok)joe && joe.ToUpper(); // boss == "JOE"
Create a static instance of your class somewhere with all the right default values for the members.
For example:
z = new Thingy { y=null };
then instead of your
return x != null ? x.y : null;
you can write
return (x ?? z).y;
This is being added in C# vNext (Roslyn powered C#, releases with Visual Studio 2014).
It is called Null propagation and is listed here as complete. https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status
It is also listed here as complete: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c
The so called "null-conditional operator" has been introduced in C# 6.0 and in Visual Basic 14.
In many situations it can be used as the exact opposite of the null-coalescing operator:
int? length = customers?.Length; // null if customers is null
Customer first = customers?[0]; // null if customers is null
int? count = customers?[0]?.Orders?.Count(); // null if customers, the first customer, or Orders is null
'code' 카테고리의 다른 글
jquery, 쿠키 삭제 (0) | 2020.09.13 |
---|---|
RecyclerView의 ListView.setEmptyView와 동일 (0) | 2020.09.13 |
비디오 스트림의 TCP 대 UDP (0) | 2020.09.12 |
Kotlin 보조 생성자 (0) | 2020.09.12 |
Java NIO : IOException : Broken pipe는 무엇을 의미합니까? (0) | 2020.09.12 |