C #에서 두 개의 물음표가 함께 무엇을 의미합니까? 줄을 가로 질러 달려보십시오. FormsAuth

이 코드 줄을 가로 질러 달려보십시오.

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

두 개의 물음표는 어떤 의미입니까, 어떤 종류의 삼항 연산자입니까? Google에서 찾기가 어렵습니다.



답변

그것은 합체 연산자이며, 삼항 (즉시) 연산자와 매우 비슷합니다. 또한보십시오 ?? 운영자-MSDN .

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

로 확장 :

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

다음으로 확장됩니다.

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

영어로, “왼쪽에있는 것이 널이 아닌 경우이를 사용하고 그렇지 않으면 오른쪽에있는 것을 사용하십시오”를 의미합니다.

이 중 몇 가지를 순서대로 사용할 수 있습니다. 다음 명령문은 널 Answer#이 아닌 첫 번째를 지정합니다 Answer(모든 응답이 널인 경우에는 Answer널임).

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

또한 위의 확장은 개념적으로 동일하지만 각 식의 결과는 한 번만 평가됩니다. 예를 들어 표현식이 부작용이있는 메소드 호출 인 경우에 중요합니다. (이 점을 지적한 @Joey에게 감사의 뜻을 전합니다.)


답변

아무도 마법의 단어를 아직 말하지 않았기 때문에 그것은 null 통합 연산자 입니다. C # 3.0 언어 사양 의 섹션 7.12에 정의되어 있습니다 .

특히 표현식에서 여러 번 사용될 때 작동하는 방식 때문에 매우 편리합니다. 형식의 표현 :

a ?? b ?? c ?? d

anull이 아닌 경우 expression의 결과를 제공하고 b, 그렇지 않으면 try c, 그렇지 않으면 try을 제공 d합니다. 모든 지점에서 단락됩니다.

또한의 유형이 d널 입력 가능하지 않은 경우 전체 표현식의 유형도 널 입력 가능하지 않습니다.


답변

Null 통합 연산자입니다.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

네, 그것이 무엇인지 알지 않는 한 검색이 거의 불가능합니다! 🙂

편집 : 그리고 이것은 다른 질문에서 멋진 기능입니다. 당신은 그들을 연결할 수 있습니다.

C #의 숨겨진 기능?


답변

모두들 감사합니다. MSDN 사이트에서 가장 간결한 설명은 다음과 같습니다.

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

답변

??값이 널일 때 널 입력 가능 유형에 값을 제공해야합니다. 따라서 formsAuth가 null이면 새 FormsAuthenticationWrapper ()를 반환합니다.


답변

두 개의 물음표 (??)는 해당 Coalescing 연산자를 나타냅니다.

Coalescing 연산자는 체인에서 첫 번째 NON-NULL 값을 반환합니다. 실제로 모든 것을 보여주는 이 YouTube 비디오 를 볼 수 있습니다 .

그러나 비디오의 내용을 더 추가하겠습니다.

통합의 영어 의미를 보면 “함께 통합”이라고 말합니다. 예를 들어 아래는 4 개의 문자열을 연결하는 간단한 통합 코드입니다.

그래서 경우는 str1이다 null그것을 시도 할 str2경우 str2입니다 null그것은 시도 할 것이다 str3그래서이 null이 아닌 값을 가진 문자열을 찾을 때까지합니다.

string final = str1 ?? str2 ?? str3 ?? str4;

간단히 말해 Coalescing 연산자는 체인에서 첫 번째 NON-NULL 값을 반환합니다.


답변

삼항 연산자의 짧은 손입니다.

FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();

또는 삼항을하지 않는 사람들을 위해 :

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}