"{}"은 무슨 뜻입니까?


36

때로는 다음 코드가 표시되며 표현식이 실제로 테스트하는 것을 모릅니다.

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

답변:


28

그것은 C # 8의 빈 속성 패턴입니다 null. 모든 값 유형 또는 참조 유형과 일치합니다. Panagiotis Kanavos가 주석에서 언급했듯이 이것은 value is object오랫동안 C #에 있었던 좋은 이전 검사 와 같습니다 .

일반적으로 속성을 지정하면 일치하거나 일치하지 않습니다. 이 난해한 예는 다음을 보여줍니다.

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

속성 패턴은 switch표현식 과 같은 경우 다른 패턴과 비교할 때 가장 잘 작동하고 가장 명확 합니다.


1
이 경우 빈 물체는 무엇을 의미합니까? 빈 문자열, 공백?
OlegI

3
@Oleg 아니요. s확실히 null이 아닙니다. is {}줄임말 is object이며 문자열 을 객체로 캐스트 할 수 있습니다.
Panagiotis Kanavos

6
@OlegI 어떻게 그렇게? 유효한 참조이므로 일치합니다.
Daniel A. White

3
그것은 구조체가 널이 될 수 있으며, 참조가 null이 될 수없는 새로운 세계, 스위치 문이 반전 다양한있다 !, !!, ?그리고 ??전후의 특성은 다른 것을 의미한다. 구문 설탕은 언제 하이 엔드입니까?
ja72

3
와 같은 value != null가요?
ca9163d9

7

Daniel의 대답은 옳지 만 빈 속성 패턴이 사용되는 이유 에 대한 컨텍스트를 추가하는 것이 도움 이 될 수 있습니다. 몇 가지 유효성 검사가 필요한이 예제 컨트롤러 방법을 고려하십시오.

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

ValidateId()의 경우 null 또는의 인스턴스를 반환 할 수 BadObjectRequestResult있습니다. 전자가 반환되면 유효성 검사가 성공하고의 나머지 본문으로 이동 Update합니다. 후자가 반환되면 is {}이다 진정한 (의 예 물론 인스턴스 BadObjectRequestResult이다가 object), 및 유효성 검사가 실패합니다.

이 중에서도 변수 이름을 제공하여 invalid즉시 반환 할 수 있습니다. 그렇지 않으면 약간 더 자세한 코드가 필요합니다.

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

하나는 더 읽기 쉬운 지 다른 쪽은 독자에게 달려 있든, 빈 속성 패턴을 사용할 수있는 한 가지 방법을 제시했습니다.


이 경우에는 다음을 사용 is object invalid하지 않아야합니다.is {} invalid
Panagiotis Kanavos

1
@PanagiotisKanavos IActionResult는 (기술적으로 Task<IActionResult>) 반품 이 필요 하기 때문에이 경우 작동하지 않습니다 . 우리는 당신의 스타일로 갈 경우,이 if같은 결과를 가지고 있지만 invalid될 것입니다 object,이 컴파일되지 않도록.
키트

0

값이 빈 객체인지 확인하는 것이라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.