code

널 병합 연산자에 "반대"가 있습니까?

codestyles 2020. 9. 12. 10:05
반응형

널 병합 연산자에 "반대"가 있습니까? (… 어떤 언어로?)


널 병합은 대략 다음과 같이 변환됩니다. 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이 아닌 : (.이 아닌) 연산자가 있습니다.

그들은?를 추가하는 것에 대해 생각하고있었습니다. 연산자를 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

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

참고URL : https://stackoverflow.com/questions/2929836/is-there-an-opposite-to-the-null-coalescing-operator-in-any-language

반응형