null을 확인하고 그렇지 않은 경우 다른 값을 할당하는 가장 짧은 방법


86

나는 당기는하고 varcharDB를 밖으로 값과 설정하려는 string만약 그들이 ""나는이에 할당 오전 null. 나는 현재 다음과 같이하고 있습니다.

if (string.IsNullOrEmpty(planRec.approved_by) == true)
  this.approved_by = "";
else
  this.approved_by = planRec.approved_by.toString();

다음과 같이 한 줄로이 작업을 수행하는 방법이 있어야합니다.

this.approved_by = "" || planRec.approved_by.toString();

그러나이를 수행하는 최적의 방법을 찾을 수 없습니다. 더 나은 방법이 있습니까, 아니면 내가 할 수있는 가장 좋은 방법이 있습니까?


5
== true는 여기서 불필요합니다 ...
cjk

답변:


104

이 시도:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? "" : planRec.approved_by.toString();

다른 사람이 말했듯이 null 통합 연산자를 사용할 수도 있습니다.

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString();

그러나이 예제는 가능한 값 this.approved_by이 설정하려는 잠재적 값 중 하나와 동일 하기 때문에 작동 합니다. 다른 모든 경우에는 첫 번째 예에서 보여준 것처럼 조건부 연산자를 사용해야합니다.


8
이 null 병합 연산자는 어쨌든 nullreference를 던지지 않습니까? 이 코드를 보는 방식은 다음과 같습니다 if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}.. 내가 틀렸다면 오류를 지적하십시오.
Destrictor

10
@Destrictor가 맞고 코드가 손상되었습니다. 다른 재미있는 연산자를 사용한 수정 사항이 있습니다. this.approved_by = planRec.approved_by?.toString() ?? ""; <-그것은 null-conditional 연산자이고,이 질문이 처음 질문되고 대답되었을 때 주변에 있다고 생각하지 않습니다. 바라건대 OP가 이것을보고, 두 작업 전의 7 년 된 코드를 리팩토링 할 수 있습니다. :).
Patrick


30

C # 통합 연산자를 찾고 있습니다. ??. 이 연산자는 왼쪽과 오른쪽 인수를받습니다. 연산자의 왼쪽이 null이거나 값이없는 nullable이면 오른쪽 인수를 반환합니다. 그렇지 않으면 왼쪽을 반환합니다.

var x = somePossiblyNullValue ?? valueIfNull;

이 답변은 질문의 모든 사례를 다루지는 않습니다 (부분적으로 만). "string.IsNullOrEmpty"가 있습니다. 따라서 여기서 빈 케이스는 처리되지 않습니다.
Bronek

28

내 생각 엔 당신이 생각 해낼 수있는 최선은

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty
                                                      : planRec.approved_by.ToString();

물론 당신은 그 사실을 암시하고 있기 때문에 approved_by입니다 object(이 수 동일하지 ""),이 같이 다시 작성 될 것이다

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();

20

C # 6에서는 planRec.approved_by가 문자열이 아닌 경우 약간 더 짧은 방법이 있습니다.

this.approved_by = planRec.approved_by?.ToString() ?? "";

15

C # 통합 연산자를 사용합니다. ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;

15

C # 8.0부터는 ?? = 연산자를 사용하여 양식의 코드를 바꿀 수 있습니다.

if (variable is null)
{
    variable = expression;
}

다음 코드로 :

variable ??= expression;

자세한 정보는 여기



2

실제 변수 이름을 반복하지 않고 (그리고 변수가 null이면 아무것도 할당하지 않고) 비어 있지 않은 변수를 할당하려면 Action매개 변수 와 함께 작은 도우미 메서드를 사용할 수 있습니다 .

public static void CallIfNonEmpty(string value, Action<string> action)
{
    if (!string.IsNullOrEmpty(value))
        action(value);
}

그런 다음 사용하십시오.

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);

1

예를 들어 SQL Server, Google ISNULLCASE내장 함수 와 같은 쿼리에서도이를 수행 할 수 있습니다 .


-4

확장 방법 SelfChk를 사용합니다.

static class MyExt {
//Self Check 
 public static void SC(this string you,ref string me)
    {
        me = me ?? you;
    }
}

그런 다음

string a = null;
"A".SC(ref a);

당신이 의미하는 것 같지만 읽고 이해하기 쉽지는 않습니다.
Ali Humayun

3
업! 당신은 절대적으로 맞다 : 매우 짧은,하지만 쉽게 읽을 NOT과 (적어도이 표기법을 사용하지 않는 경우) 이해
잭 밀러

그렇다면 책을 읽어보십시오. 당신은 정말 정교한 찾을 것하고 이해하기 쉽게 : P
알리 후마윤
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.